{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 图像分类模型"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:22.666130Z",
     "start_time": "2025-01-19T12:12:22.659782Z"
    }
   },
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "\n",
    "# 自动选择设备：如果当前环境有可用的 GPU，代码会选择 GPU 作为设备，以加速模型训练和推理。如果没有 GPU，代码会回退到 CPU。\n",
    "#提高代码的兼容性：这段代码使得程序可以在不同的环境中运行（无论是否有 GPU），而无需手动修改设备配置。  \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=12, micro=3, releaselevel='final', serial=0)\n",
      "matplotlib 3.10.0\n",
      "numpy 1.26.4\n",
      "pandas 2.2.3\n",
      "sklearn 1.6.0\n",
      "torch 2.5.1+cpu\n",
      "cpu\n"
     ]
    }
   ],
   "execution_count": 49
  },
  {
   "cell_type": "code",
   "source": "28 * 28",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.022055Z",
     "start_time": "2025-01-19T12:12:23.016913Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "784"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 50
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": "## 数据准备1，为了看灰度图片"
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.582254Z",
     "start_time": "2025-01-19T12:12:23.049498Z"
    }
   },
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "# 定义数据集的变换，transforms.Compose 用于将多个数据预处理操作组合在一起，形成一个完整的预处理流水线。这里没有进行预处理\n",
    "transform = transforms.Compose([\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 51
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.588514Z",
     "start_time": "2025-01-19T12:12:23.583254Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torchvision.datasets.mnist.FashionMNIST"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 52
  },
  {
   "cell_type": "code",
   "source": [
    "len(train_ds)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.594551Z",
     "start_time": "2025-01-19T12:12:23.589514Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "60000"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 53
  },
  {
   "cell_type": "code",
   "source": [
    "type(train_ds[0])"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.600302Z",
     "start_time": "2025-01-19T12:12:23.595551Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.606093Z",
     "start_time": "2025-01-19T12:12:23.601302Z"
    }
   },
   "cell_type": "code",
   "source": "train_ds",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Dataset FashionMNIST\n",
       "    Number of datapoints: 60000\n",
       "    Root location: data\n",
       "    Split: Train\n",
       "    StandardTransform\n",
       "Transform: Compose(\n",
       "           )"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 55
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.610078Z",
     "start_time": "2025-01-19T12:12:23.607093Z"
    }
   },
   "source": [
    "# 通过id取数据，取到的是一个元祖,是第一个样本,在训练时，把特征和标签分开\n",
    "img, label = train_ds[0]"
   ],
   "outputs": [],
   "execution_count": 56
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.615335Z",
     "start_time": "2025-01-19T12:12:23.611079Z"
    }
   },
   "cell_type": "code",
   "source": "type(img)  #因为前面没有对训练集进行预处理，所以img是图片类型",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PIL.Image.Image"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 57
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.620772Z",
     "start_time": "2025-01-19T12:12:23.616335Z"
    }
   },
   "cell_type": "code",
   "source": "type(label)",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "int"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 58
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.626614Z",
     "start_time": "2025-01-19T12:12:23.621774Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACS0lEQVR4AWKgA2BkYOD1ZGBgZAHZxcjIAKZBbBBm+quS8v3rj1N/GBiZGP8wMKNIMv91cnnCzuU65+X/vww8/76hSP5iMFVgZtpp2HXm8nUz02PHGUHGQTHjf9cugd//GE7f+cUo8ft0yDSEJCMDw/8TCgyMf34x/Ph3/vYfT0VphLH/GRgY3kt+Z2fl+cH5z8aSSWwHqmsZuJiZvn18p/CPkYnr7z9ZBiaofQwMjMwMPFI/frH++sr/j537K9sldhOE5H9mhnBJJg4Gbtlf7L//cQhvusaCkGT5xXDlBxsXl6rSD2Yunr9PoraeYAGZx8T4+x/DHwaGbV+/s/1/zczxm+H3P2a9jwxMDMz///z6+Y+BwW7ime9v//z78/XrXw6GbwxsX4NAYc3AICSlJhmk/oPpN+czVjbhX1zHeOz+fWR9qcnIYNkkKvCX+cMfrl+M36+HneEVVGC4x/v5GycPHxcj83GpP3+/MTB/Z2DgF0lwy3z24/49VeFfrLxsf+UBY0xqv8vDw87Ayv/4mSiTRACHIrexMdMvJjYGRlYLlpeP+X485mHje/eQ5/uPP+svKwj9+vD77y/Wf4xsaixP/z/mFvnw5jULOysHL9Mbza+P37O/+f3nN6fERwOWC+sTn937wcPGwcb88+//by/+/WX5wfPrw4fffxRfMjIweBWLv/7wl5mNhZnxPysrGysjA+NLBrZ/EpfCGJn+MTA4tYnxMzGz/GV8+f/pvy/MDP9/f2Paff0YJBAYGBg0RN/LPPx1Fx5HFDIAaCTYdiCc4RIAAAAASUVORK5CYII=",
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q=="
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 59
  },
  {
   "cell_type": "code",
   "source": [
    "label"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.632747Z",
     "start_time": "2025-01-19T12:12:23.628611Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 60
  },
  {
   "cell_type": "code",
   "source": [
    "# 显示图片，这里需要把transforms.ToTensor(),进行归一化注释掉，否则是不行的\n",
    "def show_img_content(img):\n",
    "    from PIL import Image\n",
    "\n",
    "    # 打开一个图像文件\n",
    "    # img = Image.open(img)\n",
    "\n",
    "    print(\"图像大小:\", img.size)\n",
    "    print(\"图像模式:\", img.mode)\n",
    "\n",
    "    # 如果图像是单通道的，比如灰度图，你可以这样获取像素值列表：\n",
    "    if img.mode == 'L':\n",
    "        pixel_values = list(img.getdata())\n",
    "        print(pixel_values)\n",
    "\n",
    "\n",
    "show_img_content(img)  #这里必须把上面的 transforms.ToTensor(), # 转换为tensor，进行归一化注释掉，否则是不行的"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.638616Z",
     "start_time": "2025-01-19T12:12:23.633752Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "图像大小: (28, 28)\n",
      "图像模式: L\n",
      "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 13, 73, 0, 0, 1, 4, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 36, 136, 127, 62, 54, 0, 0, 0, 1, 3, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 102, 204, 176, 134, 144, 123, 23, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 236, 207, 178, 107, 156, 161, 109, 64, 23, 77, 130, 72, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141, 88, 172, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196, 229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 12, 219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197, 209, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 99, 244, 222, 220, 218, 203, 198, 221, 215, 213, 222, 220, 245, 119, 167, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 55, 236, 228, 230, 228, 240, 232, 213, 218, 223, 234, 217, 217, 209, 92, 0, 0, 0, 1, 4, 6, 7, 2, 0, 0, 0, 0, 0, 237, 226, 217, 223, 222, 219, 222, 221, 216, 223, 229, 215, 218, 255, 77, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 62, 145, 204, 228, 207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244, 159, 0, 0, 0, 0, 0, 18, 44, 82, 107, 189, 228, 220, 222, 217, 226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238, 215, 0, 0, 57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200, 159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232, 246, 0, 3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240, 80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228, 225, 0, 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217, 241, 65, 73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224, 229, 29, 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198, 213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221, 230, 67, 48, 203, 183, 194, 213, 197, 185, 190, 194, 192, 202, 214, 219, 221, 220, 236, 225, 216, 199, 206, 186, 181, 177, 172, 181, 205, 206, 115, 0, 122, 219, 193, 179, 171, 183, 196, 204, 210, 213, 207, 211, 210, 200, 196, 194, 191, 195, 191, 198, 192, 176, 156, 167, 177, 210, 92, 0, 0, 74, 189, 212, 191, 175, 172, 175, 181, 185, 188, 189, 188, 193, 198, 204, 209, 210, 210, 211, 188, 188, 194, 192, 216, 170, 0, 2, 0, 0, 0, 66, 200, 222, 237, 239, 242, 246, 243, 244, 221, 220, 193, 191, 179, 182, 182, 181, 176, 166, 168, 99, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 61, 44, 72, 41, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
     ]
    }
   ],
   "execution_count": 61
  },
  {
   "cell_type": "code",
   "source": [
    "#这个代码必须是注释了上面的 transforms.ToTensor()才能够运行的\n",
    "def show_single_image(img_arr):\n",
    "    plt.imshow(img_arr, cmap=\"binary\")  # 显示图片，colormap用于指定图像的颜色映射，cmap=\"binary\"：指定使用二值颜色映射，通常用于显示灰度图像\n",
    "    plt.colorbar()  # 显示颜色条\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "show_single_image(img)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.762594Z",
     "start_time": "2025-01-19T12:12:23.639619Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ],
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 62
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 数据准备2，为训练做准备"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.811110Z",
     "start_time": "2025-01-19T12:12:23.763593Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "from torchvision import transforms\n",
    "\n",
    "# 定义数据集的变换，transforms.Compose 用于将多个数据预处理操作组合在一起，形成一个完整的预处理流水线。\n",
    "#它接受一个列表作为参数，列表中的每个元素是一个数据预处理操作。\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),  # 转换为tensor，接口里默认进行进行归一化\n",
    "    # transforms.Normalize(mean, std) # 标准化，mean和std是数据集的均值和方差，要自己算出来再给他传到这里\n",
    "])\n",
    "# fashion_mnist图像分类数据集，衣服分类，60000张训练图片，10000张测试图片\n",
    "#加载训练集\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "#加载测试集\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=transform\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
   ],
   "outputs": [],
   "execution_count": 63
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "对数据集进行切片"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.815107Z",
     "start_time": "2025-01-19T12:12:23.812109Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# from torch.utils.data import Subset\n",
    "# \n",
    "# # 定义切片范围\n",
    "# start = 1000  # 起始索引\n",
    "# end = 2000    # 结束索引\n",
    "# \n",
    "# # 创建子集\n",
    "# subset_ds = Subset(train_ds, range(start, end))\n",
    "# \n",
    "# # 使用子集\n",
    "# for img, label in subset_ds:\n",
    "#     print(img.shape, label)"
   ],
   "outputs": [],
   "execution_count": 64
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.820977Z",
     "start_time": "2025-01-19T12:12:23.816106Z"
    }
   },
   "cell_type": "code",
   "source": [
    "img, label = train_ds[0]\n",
    "img.shape  #img这时是一个tensor，shape=(1, 28, 28)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 28, 28])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 65
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.825985Z",
     "start_time": "2025-01-19T12:12:23.821977Z"
    }
   },
   "cell_type": "code",
   "source": "type(img)  #Tensor,中文是张量，和numpy的array相似",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Tensor"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 66
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.831788Z",
     "start_time": "2025-01-19T12:12:23.827981Z"
    }
   },
   "cell_type": "code",
   "source": "type(label)",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "int"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 67
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.912168Z",
     "start_time": "2025-01-19T12:12:23.901122Z"
    }
   },
   "cell_type": "code",
   "source": "img",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.0000, 0.0510,\n",
       "          0.2863, 0.0000, 0.0000, 0.0039, 0.0157, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0118, 0.0000, 0.1412, 0.5333,\n",
       "          0.4980, 0.2431, 0.2118, 0.0000, 0.0000, 0.0000, 0.0039, 0.0118,\n",
       "          0.0157, 0.0000, 0.0000, 0.0118],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0235, 0.0000, 0.4000, 0.8000,\n",
       "          0.6902, 0.5255, 0.5647, 0.4824, 0.0902, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0471, 0.0392, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.6078, 0.9255,\n",
       "          0.8118, 0.6980, 0.4196, 0.6118, 0.6314, 0.4275, 0.2510, 0.0902,\n",
       "          0.3020, 0.5098, 0.2824, 0.0588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0039, 0.0000, 0.2706, 0.8118, 0.8745,\n",
       "          0.8549, 0.8471, 0.8471, 0.6392, 0.4980, 0.4745, 0.4784, 0.5725,\n",
       "          0.5529, 0.3451, 0.6745, 0.2588],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0039, 0.0039, 0.0000, 0.7843, 0.9098, 0.9098,\n",
       "          0.9137, 0.8980, 0.8745, 0.8745, 0.8431, 0.8353, 0.6431, 0.4980,\n",
       "          0.4824, 0.7686, 0.8980, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7176, 0.8824, 0.8471,\n",
       "          0.8745, 0.8941, 0.9216, 0.8902, 0.8784, 0.8706, 0.8784, 0.8667,\n",
       "          0.8745, 0.9608, 0.6784, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.7569, 0.8941, 0.8549,\n",
       "          0.8353, 0.7765, 0.7059, 0.8314, 0.8235, 0.8275, 0.8353, 0.8745,\n",
       "          0.8627, 0.9529, 0.7922, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0039, 0.0118, 0.0000, 0.0471, 0.8588, 0.8627, 0.8314,\n",
       "          0.8549, 0.7529, 0.6627, 0.8902, 0.8157, 0.8549, 0.8784, 0.8314,\n",
       "          0.8863, 0.7725, 0.8196, 0.2039],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0235, 0.0000, 0.3882, 0.9569, 0.8706, 0.8627,\n",
       "          0.8549, 0.7961, 0.7765, 0.8667, 0.8431, 0.8353, 0.8706, 0.8627,\n",
       "          0.9608, 0.4667, 0.6549, 0.2196],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0157, 0.0000, 0.0000, 0.2157, 0.9255, 0.8941, 0.9020,\n",
       "          0.8941, 0.9412, 0.9098, 0.8353, 0.8549, 0.8745, 0.9176, 0.8510,\n",
       "          0.8510, 0.8196, 0.3608, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0039, 0.0157, 0.0235, 0.0275, 0.0078, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.9294, 0.8863, 0.8510, 0.8745,\n",
       "          0.8706, 0.8588, 0.8706, 0.8667, 0.8471, 0.8745, 0.8980, 0.8431,\n",
       "          0.8549, 1.0000, 0.3020, 0.0000],\n",
       "         [0.0000, 0.0118, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.2431, 0.5686, 0.8000, 0.8941, 0.8118, 0.8353, 0.8667,\n",
       "          0.8549, 0.8157, 0.8275, 0.8549, 0.8784, 0.8745, 0.8588, 0.8431,\n",
       "          0.8784, 0.9569, 0.6235, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0706, 0.1725, 0.3216, 0.4196,\n",
       "          0.7412, 0.8941, 0.8627, 0.8706, 0.8510, 0.8863, 0.7843, 0.8039,\n",
       "          0.8275, 0.9020, 0.8784, 0.9176, 0.6902, 0.7373, 0.9804, 0.9725,\n",
       "          0.9137, 0.9333, 0.8431, 0.0000],\n",
       "         [0.0000, 0.2235, 0.7333, 0.8157, 0.8784, 0.8667, 0.8784, 0.8157,\n",
       "          0.8000, 0.8392, 0.8157, 0.8196, 0.7843, 0.6235, 0.9608, 0.7569,\n",
       "          0.8078, 0.8745, 1.0000, 1.0000, 0.8667, 0.9176, 0.8667, 0.8275,\n",
       "          0.8627, 0.9098, 0.9647, 0.0000],\n",
       "         [0.0118, 0.7922, 0.8941, 0.8784, 0.8667, 0.8275, 0.8275, 0.8392,\n",
       "          0.8039, 0.8039, 0.8039, 0.8627, 0.9412, 0.3137, 0.5882, 1.0000,\n",
       "          0.8980, 0.8667, 0.7373, 0.6039, 0.7490, 0.8235, 0.8000, 0.8196,\n",
       "          0.8706, 0.8941, 0.8824, 0.0000],\n",
       "         [0.3843, 0.9137, 0.7765, 0.8235, 0.8706, 0.8980, 0.8980, 0.9176,\n",
       "          0.9765, 0.8627, 0.7608, 0.8431, 0.8510, 0.9451, 0.2549, 0.2863,\n",
       "          0.4157, 0.4588, 0.6588, 0.8588, 0.8667, 0.8431, 0.8510, 0.8745,\n",
       "          0.8745, 0.8784, 0.8980, 0.1137],\n",
       "         [0.2941, 0.8000, 0.8314, 0.8000, 0.7569, 0.8039, 0.8275, 0.8824,\n",
       "          0.8471, 0.7255, 0.7725, 0.8078, 0.7765, 0.8353, 0.9412, 0.7647,\n",
       "          0.8902, 0.9608, 0.9373, 0.8745, 0.8549, 0.8314, 0.8196, 0.8706,\n",
       "          0.8627, 0.8667, 0.9020, 0.2627],\n",
       "         [0.1882, 0.7961, 0.7176, 0.7608, 0.8353, 0.7725, 0.7255, 0.7451,\n",
       "          0.7608, 0.7529, 0.7922, 0.8392, 0.8588, 0.8667, 0.8627, 0.9255,\n",
       "          0.8824, 0.8471, 0.7804, 0.8078, 0.7294, 0.7098, 0.6941, 0.6745,\n",
       "          0.7098, 0.8039, 0.8078, 0.4510],\n",
       "         [0.0000, 0.4784, 0.8588, 0.7569, 0.7020, 0.6706, 0.7176, 0.7686,\n",
       "          0.8000, 0.8235, 0.8353, 0.8118, 0.8275, 0.8235, 0.7843, 0.7686,\n",
       "          0.7608, 0.7490, 0.7647, 0.7490, 0.7765, 0.7529, 0.6902, 0.6118,\n",
       "          0.6549, 0.6941, 0.8235, 0.3608],\n",
       "         [0.0000, 0.0000, 0.2902, 0.7412, 0.8314, 0.7490, 0.6863, 0.6745,\n",
       "          0.6863, 0.7098, 0.7255, 0.7373, 0.7412, 0.7373, 0.7569, 0.7765,\n",
       "          0.8000, 0.8196, 0.8235, 0.8235, 0.8275, 0.7373, 0.7373, 0.7608,\n",
       "          0.7529, 0.8471, 0.6667, 0.0000],\n",
       "         [0.0078, 0.0000, 0.0000, 0.0000, 0.2588, 0.7843, 0.8706, 0.9294,\n",
       "          0.9373, 0.9490, 0.9647, 0.9529, 0.9569, 0.8667, 0.8627, 0.7569,\n",
       "          0.7490, 0.7020, 0.7137, 0.7137, 0.7098, 0.6902, 0.6510, 0.6588,\n",
       "          0.3882, 0.2275, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1569,\n",
       "          0.2392, 0.1725, 0.2824, 0.1608, 0.1373, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000],\n",
       "         [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000,\n",
       "          0.0000, 0.0000, 0.0000, 0.0000]]])"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 68
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:23.990787Z",
     "start_time": "2025-01-19T12:12:23.986486Z"
    }
   },
   "cell_type": "code",
   "source": "label",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "9"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 69
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.311983Z",
     "start_time": "2025-01-19T12:12:24.178612Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#计算均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds:  # 这是一个解包操作，遍历每张图片,img.shape=[1,28,28]，这里的 _ 是一个占位符，表示忽略某个值，如果去掉了_,那么img得到的是一个(img,label)的元组，而不只是img这个张量，因而.mean和.std都无法进行\n",
    "        mean += img.mean(dim=(1, 2))  # 计算每张图片的均值，dim=(1, 2)表示计算每张图片的每一个像素的均值,行列共同求均值\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "execution_count": 70
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.637944Z",
     "start_time": "2025-01-19T12:12:32.313980Z"
    }
   },
   "source": [
    "def show_imgs(n_rows, n_cols, train_ds, class_names):\n",
    "    assert n_rows * n_cols < len(train_ds)  #确保打印的图片小于总样本数\n",
    "    plt.figure(figsize=(n_cols * 1.4, n_rows * 1.6))  #宽1.4高1.6，宽，高\n",
    "    for row in range(n_rows):\n",
    "        for col in range(n_cols):\n",
    "            index = n_cols * row + col  # 计算索引，从0开始\n",
    "            plt.subplot(n_rows, n_cols, index + 1)  #因为从1开始\n",
    "            img_arr, label = train_ds[index]\n",
    "            img_arr = np.transpose(img_arr, (1, 2, 0))  # 通道换到最后一维\n",
    "            plt.imshow(img_arr, cmap=\"binary\",\n",
    "                       interpolation='nearest')  #interpolation='nearest'是临近插值\n",
    "            plt.axis('off')  #去除坐标系\n",
    "            plt.title(class_names[label])  # 显示类别名称\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "#已知的图片类别\n",
    "# lables在这个路径https://github.com/zalandoresearch/fashion-mnist\n",
    "class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',\n",
    "               'Coat', 'Sandal', 'Shirt', 'Sneaker',\n",
    "               'Bag', 'Ankle boot']  #0-9分别代表的类别\n",
    "#只是打印了前15个样本\n",
    "show_imgs(3, 5, train_ds, class_names)\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 700x480 with 15 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGMCAYAAADA5EjBAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAb4tJREFUeJztnQe41FS3hoPSe++9SRekIwqCiDQFRRFFQBRRUcGG/Cr2hogoImDFgvyi0hEFFJCuFKnSm/TeBFGQuc/KvZP7ZZ3sMOdwymTme5/nwJ7Jnkxmt+ysmi4UCoUsQgghhJAAcklaXwAhhBBCSFLhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGDhRoYQQgghgYUbGUIIIYQEFm5kCCGEEBJYuJEhhBBCSGCJqo1M9+7drezZs1+wXtOmTe2/5ELOVa1atWQ7H0ketm/fbqVLl8568803L1j3+eeft+uS6IH9R0jasj1O5uBFb2SGDx9u//j69esnzxXFGa+++qo1ceJEK4hIv0fyN2fOHCuaOH36tD1po+26Uhv2X+zx6aefuvouc+bMVtGiRa2WLVtaQ4cOtU6ePJnWl0gAzsHkIf3FnuDLL7+0Spcubf3666/W5s2brfLlyyfPlcXRRqZjx45W+/btraDxxRdfuF5//vnn1syZMxO8X7ly5RS/lmeeecbq379/xJPwhRdesMvJKdkLGuy/2OXFF1+0ypQpY509e9bat2+ffcPp27ev9dZbb1mTJ0+2atSokdaXSDgHo2Mjs23bNmvhwoXW+PHjrV69etmbmueeey75ro5ENV26dHG9Xrx4sT0J9fupQfr06e0/P86fP2/9888/qXZN0Q77L3Zp1aqVVadOHef1f/7zH2vWrFlW27ZtrRtuuMFat26dlSVLFs/Pnjp1ysqWLVsqXm38wjkYBaol2bjkyZPHatOmjS1VkNd+OroPPvjAKleunJUpUyarbt261pIlSy74HStWrLAKFChg7/r+/PNPY72///7b3kSJREjOX6JECatfv372+5GybNkyq1GjRvYEl6eZkSNHJqhz4MAB6+6777YKFSpki20vv/xy67PPPvNcDB577DH7OuR6LrvsMrsNMNm4tIvUk8+HRYhiJxQvLF261BZ558+f32nzHj16eNa90Njx0u/K6wcffNAel1WrVrU/K30q40mQJ4pwu8vnSeJg/wWLZs2aWQMGDLB27NhhjR492mWXuGXLFqt169ZWjhw5rDvuuMO5ab399tt228taJ2uePLAePXo00ePgq6++smrXrm2fP2fOnFb16tWtd955JxV/fWzCOZgMEhn5cTfddJOVMWNGq3PnztaIESPsxpFG0owZM8bWz8pEkB/9xhtv2J/dunWrlSFDBs/zy7mkk+TJYtKkScYnCJlw8pQxf/58695777XFcKtXr7aGDBlibdy4MSIbFJmcMpFvvfVW+7d8/fXX1v3332//tvDA+Ouvv+wNlajQpHNl0HzzzTf2YnDs2DGrT58+dj3ZrMj1zJ4929701KxZ05o+fbr1xBNPWLt377avSxDx4T333GPVq1fPvm5BBlo8IBvC6667zp4QIs7MnTu3vekV6V5yjJ0w8hQqfSn9JZNdNp4yTqVvO3ToYJ9HoKg9cbD/gsmdd95pPfXUU9aMGTOsnj172u+dO3fOXmcbN25sP2xlzZrVfl/6S2xu7rrrLuvhhx+2JfDDhg2zfvvtN2vBggV230UyDkTCIGtq8+bNrYEDB9rviURIzhFeM0ni4RwEQklk6dKlIloIzZw50359/vz5UPHixUN9+vRx1du2bZtdL1++fKEjR44470+aNMl+f8qUKc573bp1C2XLls0uz58/P5QzZ85QmzZtQmfOnHGds0mTJvZfmC+++CJ0ySWXhObNm+eqN3LkSPs7FixY4Ptb5FxSb/Dgwc57f//9d6hmzZqhggULhv755x/7vbffftuuN3r0aKeeHGvYsGEoe/bsoRMnTtjvTZw40a738ssvu76nY8eOoXTp0oU2b97svCe/V353LNC7d2/7d0fChAkT7LpLliwx1knM2HnuuecSfLe8lnGxdu1a1/sHDx60j8lnyP/D/gs+o0aNumC/5MqVK1SrVi27LGuP1O/fv7+rjqyl8v6XX37pev+HH35wvR/JOJB7gqzl586du8hfF/twDiaNSy5GGiOixmuuucZ+Lbu8Tp062SLEf//9N0F9OSZqqDBXXXWV/b/sCDUiyZAnBNnBy+5SxFl+iFREpDCVKlWyDh065PyJKDV8vgshukHZrYYRSYy8ll2vqJyEadOmWYULF7afLsLIblaeVkTt9fPPPzv1Lr30Uvt9RFRNMja+//57K96Rpwdh6tSptkGiH4kZO5omTZpYVapU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YOFGhhBCCCGBhRsZQgghhASWmN7IbN++3UqXLp315ptvXrDu888/b9clF0f37t2t7NmzX7Be06ZN7b/kQs5VrVq1ZDsfSV0+/fRTe/7JnE3KmCtdunSKXBeJDPZffNwno5U03chI40XyN2fOHCuaOH36tL3xibbrSirDhw+327l+/fppfSmB5NVXX7UmTpxoBY3Vq1dbHTt2tEqVKmVlzpzZKlasmNWiRQvr3XffTetLIxHA/gsO7KuUJb2VhnzxxReu159//rk1c+bMBO9Xrlw5xa/lmWeesfr37x/xRuaFF16wy8kpVUgrvvzyS/uJ6Ndff7U2b95slS9fPq0vKXAbGVmk2rdvbwWFhQsXWtdcc41VsmRJq2fPnlbhwoWtnTt3WosXL7beeecd66GHHkrrSyQ+sP+CA/sqxjcyXbp0cb2WjpWNjH4/NUifPr3958f58+etf/75x4oltm3bZk+08ePHW7169bI3Nc8991xaXxZJYV555RUrV65c1pIlS6zcuXO7jh04cCDNrotEBvsvOLCvLPvhP2vWrCl2/kDbyCxdutRq2bKllT9/fitLlixWmTJlrB49enjW/eCDD6xy5cpZmTJlsurWrWsPqgvZyMjrBx980L65V61a1f7syJEjrQIFCtjHRSoTVn/J54OI/LY8efJYbdq0saUK8tpPh3qhdvRixYoVdpuJ9OrPP/801vv777/tTZRIhOT8JUqUsPr162e/HynLli2zGjVq5IwH6S+NLB533323VahQIVvMe/nll1ufffZZgnqnTp2yHnvsMfs65Houu+wyuw1CoZBTR9pF6snnw2NBdP7RzpYtW+wxrRdWoWDBgk551KhRVrNmzez3pA2qVKlijRgxIsFnRKLXtm1ba/78+Va9evXsdi1btqwtZdWsXbvWPqf0UfHixa2XX37ZfkjQTJo0yR6XRYsWtb9bxt1LL71k/fvvv1a8w/6Lvb4K329ETS32ftJm8rkffvghwed2795t3+tkDcv0f/U++eQTVx156H722Wet2rVr2xupbNmyWVdddZU1e/bsC16zrHH33nuvlTFjRvshN8zo0aPt80nf582b17rtttts6ZKXvaKsxVdffbW9gXnqqaesmJXIXAxyM7ruuuvsG6SohGSQyA0XGz3MmDFjrJMnT9oSBxksb7zxhnXTTTdZW7dutTJkyOD7PbNm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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 71
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "batch_size太小，梯度不准确\n",
    "batch_size太大，内存不够"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.642653Z",
     "start_time": "2025-01-19T12:12:32.639173Z"
    }
   },
   "source": [
    "# 从数据集到dataloader，是一个迭代器，每次迭代拿出来都是一个Tensor\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)  #batch_size分批，shuffle洗牌\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
   ],
   "outputs": [],
   "execution_count": 72
  },
  {
   "cell_type": "markdown",
   "source": [
    "在PyTorch中，`DataLoader`是一个迭代器，它封装了数据的加载和预处理过程，使得在训练机器学习模型时可以方便地批量加载数据。`DataLoader`主要负责以下几个方面：\n",
    "\n",
    "1. **批量加载数据**：`DataLoader`可以将数据集（Dataset）切分为更小的批次（batch），每次迭代提供一小批量数据，而不是单个数据点。这有助于模型学习数据中的统计依赖性，并且可以更高效地利用GPU等硬件的并行计算能力。\n",
    "\n",
    "2. **数据打乱**：默认情况下，`DataLoader`会在每个epoch（训练周期）开始时打乱数据的顺序。这有助于模型训练时避免陷入局部最优解，并且可以提高模型的泛化能力。\n",
    "\n",
    "3. **多线程数据加载**：`DataLoader`支持多线程（通过参数`num_workers`）来并行地加载数据，这可以显著减少训练过程中的等待时间，尤其是在处理大规模数据集时。\n",
    "\n",
    "4. **数据预处理**：`DataLoader`可以与`transforms`结合使用，对加载的数据进行预处理，如归一化、标准化、数据增强等操作。\n",
    "\n",
    "5. **内存管理**：`DataLoader`负责管理数据的内存使用，确保在训练过程中不会耗尽内存资源。\n",
    "\n",
    "6. **易用性**：`DataLoader`提供了一个简单的接口，可以很容易地集成到训练循环中。\n",
    "\n"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.657482Z",
     "start_time": "2025-01-19T12:12:32.643652Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# labels也被自动堆叠成了张量\n",
    "for datas, labels in train_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break\n",
    "print(len(train_loader))\n",
    "#查看val_loader\n",
    "for datas, labels in val_loader:\n",
    "    print(datas.shape)\n",
    "    print(labels.shape)\n",
    "    break\n",
    "print(len(val_loader))"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "1875\n",
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32])\n",
      "313\n"
     ]
    }
   ],
   "execution_count": 73
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.661956Z",
     "start_time": "2025-01-19T12:12:32.658486Z"
    }
   },
   "cell_type": "code",
   "source": [
    "print(len(train_ds))\n",
    "print(len(test_ds))"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "60000\n",
      "10000\n"
     ]
    }
   ],
   "execution_count": 74
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.670083Z",
     "start_time": "2025-01-19T12:12:32.662959Z"
    }
   },
   "source": [
    "#全连接层神经网络,在 PyTorch 中，nn.Module 是所有神经网络模块的基类。当你定义一个模型类并继承 nn.Module 时，PyTorch 会通过 __call__ 方法自动调用 forward 方法。\n",
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()  # 继承父类的初始化方法，子类有父类的属性\n",
    "        self.flatten = nn.Flatten()  # 展平层  类初始化了一个对象\n",
    "        #self.flatten=nn.reshape(32,784)  # 展平层\n",
    "        #Sequential是容器，可以自动将网络层连接在一起\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            # 输入层：不计入层数。\n",
    "            #  隐藏层：线性层 + 激活函数共同视为一层。\n",
    "            # 输出层：单独计为一层。\n",
    "            # 激活函数：不单独计为一层，而是与前面的线性层共同视为一层。\n",
    "            nn.Linear(784, 300),  # 第一个隐藏层 in_features=784, out_features=300, 784是输入特征数，也是输入层神经元的个数；300是输出特征数，也是这一层的神经元的个数\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(300, 100),  #第二个隐藏层 神经元数100\n",
    "            nn.ReLU(),  # 激活函数\n",
    "            nn.Linear(100, 10),  #输出层神经元数10 \n",
    "        )\n",
    "\n",
    "    def forward(self, x):  # 前向计算，前向传播。指的是数据从输入层经过网络的各层计算，最终得到输出的过程。\n",
    "        # x.shape [batch size, 1, 28, 28],1是通道数，灰度图是单通道\n",
    "        x = self.flatten(x)  #self.flatten：是一个 nn.Flatten 对象。self.flatten(x)：调用 self.flatten 的 __call__ 方法，最终会调用 forward 方法。   给对象加括号，会自动调用对象内部的__call__方法.        \n",
    "        # print(f'x.shape--{x.shape}')\n",
    "        # 展平后 x.shape [batch size, 784]\n",
    "        logits = self.linear_relu_stack(x)   #矩阵运算\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits  #没有经过softmax,称为logits\n",
    "\n",
    "\n",
    "model = NeuralNetwork()"
   ],
   "outputs": [],
   "execution_count": 75
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.675378Z",
     "start_time": "2025-01-19T12:12:32.671083Z"
    }
   },
   "source": [
    "# 看看网络结构\n",
    "model"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "NeuralNetwork(\n",
       "  (flatten): Flatten(start_dim=1, end_dim=-1)\n",
       "  (linear_relu_stack): Sequential(\n",
       "    (0): Linear(in_features=784, out_features=300, bias=True)\n",
       "    (1): ReLU()\n",
       "    (2): Linear(in_features=300, out_features=100, bias=True)\n",
       "    (3): ReLU()\n",
       "    (4): Linear(in_features=100, out_features=10, bias=True)\n",
       "  )\n",
       ")"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 76
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.680162Z",
     "start_time": "2025-01-19T12:12:32.675378Z"
    }
   },
   "cell_type": "code",
   "source": [
    "#为了查看模型运算的tensor尺寸\n",
    "x = torch.randn(32, 1, 28, 28)\n",
    "print(x.shape)\n",
    "logits = model(x)\n",
    "print(logits.shape)"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n",
      "torch.Size([32, 10])\n"
     ]
    }
   ],
   "execution_count": 77
  },
  {
   "cell_type": "code",
   "source": [
    "# 计算模型参数数量\n",
    "784 * 300 + 300 + 300 * 100 + 100 + 100 * 10 + 10"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.685564Z",
     "start_time": "2025-01-19T12:12:32.681164Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "266610"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 78
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.690897Z",
     "start_time": "2025-01-19T12:12:32.686564Z"
    }
   },
   "source": [
    "for name, param in model.named_parameters():  # 打印模型参数，named_parameters 是 PyTorch 中 nn.Module 类的一个方法，它返回一个包含网络各层参数名称和值的字典。这里拆包了     [神经元个数,参数个数]  实际应为[784,300]\n",
    "    print(name, param.shape)    "
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "linear_relu_stack.0.weight torch.Size([300, 784])\n",
      "linear_relu_stack.0.bias torch.Size([300])\n",
      "linear_relu_stack.2.weight torch.Size([100, 300])\n",
      "linear_relu_stack.2.bias torch.Size([100])\n",
      "linear_relu_stack.4.weight torch.Size([10, 100])\n",
      "linear_relu_stack.4.bias torch.Size([10])\n"
     ]
    }
   ],
   "execution_count": 79
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.707553Z",
     "start_time": "2025-01-19T12:12:32.691896Z"
    }
   },
   "source": [
    "# 看看模型参数\n",
    "list(model.parameters())  # 这种方法拿到模型的所有可学习参数,权值加偏置,requires_grad=True\n"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[Parameter containing:\n",
       " tensor([[ 0.0194,  0.0071,  0.0132,  ...,  0.0105,  0.0066,  0.0332],\n",
       "         [ 0.0296, -0.0179, -0.0133,  ..., -0.0084,  0.0193,  0.0163],\n",
       "         [-0.0186, -0.0100,  0.0181,  ..., -0.0215, -0.0124, -0.0057],\n",
       "         ...,\n",
       "         [ 0.0029, -0.0280,  0.0258,  ...,  0.0185, -0.0224,  0.0348],\n",
       "         [-0.0326,  0.0349,  0.0173,  ..., -0.0334,  0.0291, -0.0339],\n",
       "         [ 0.0238, -0.0110, -0.0185,  ...,  0.0112,  0.0116,  0.0099]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0355, -0.0169,  0.0218, -0.0068, -0.0183,  0.0309, -0.0183, -0.0111,\n",
       "         -0.0174,  0.0150, -0.0317,  0.0211,  0.0135, -0.0002,  0.0026, -0.0264,\n",
       "         -0.0213,  0.0250, -0.0315, -0.0019, -0.0062,  0.0082,  0.0161, -0.0161,\n",
       "         -0.0112,  0.0291, -0.0071,  0.0193,  0.0292, -0.0078, -0.0177, -0.0012,\n",
       "          0.0108,  0.0114,  0.0249, -0.0157, -0.0142, -0.0192,  0.0250,  0.0079,\n",
       "         -0.0059,  0.0327, -0.0155, -0.0009,  0.0098, -0.0129,  0.0160, -0.0104,\n",
       "         -0.0012,  0.0144,  0.0044, -0.0284, -0.0213, -0.0029,  0.0102, -0.0305,\n",
       "          0.0286,  0.0005,  0.0051, -0.0128, -0.0169,  0.0354,  0.0190,  0.0199,\n",
       "         -0.0301,  0.0298,  0.0123, -0.0170, -0.0036,  0.0203, -0.0156, -0.0034,\n",
       "         -0.0110,  0.0042,  0.0286, -0.0345,  0.0241, -0.0315,  0.0119, -0.0194,\n",
       "         -0.0255,  0.0232,  0.0324,  0.0005, -0.0135, -0.0317,  0.0324, -0.0326,\n",
       "         -0.0200,  0.0206, -0.0209,  0.0065,  0.0094,  0.0018,  0.0161,  0.0269,\n",
       "          0.0042, -0.0227, -0.0062, -0.0012,  0.0024,  0.0351,  0.0193, -0.0289,\n",
       "         -0.0253, -0.0256, -0.0303,  0.0059,  0.0078, -0.0261, -0.0104, -0.0080,\n",
       "         -0.0034, -0.0007,  0.0285,  0.0223,  0.0335,  0.0048, -0.0176,  0.0178,\n",
       "          0.0040,  0.0241, -0.0161, -0.0225, -0.0280, -0.0294, -0.0297,  0.0333,\n",
       "         -0.0188,  0.0322, -0.0220, -0.0178,  0.0103,  0.0028,  0.0036,  0.0042,\n",
       "          0.0302,  0.0199, -0.0097,  0.0306, -0.0041,  0.0130,  0.0177, -0.0227,\n",
       "         -0.0003, -0.0212, -0.0349, -0.0184, -0.0050,  0.0231,  0.0068,  0.0111,\n",
       "          0.0023,  0.0185, -0.0300,  0.0088, -0.0214,  0.0009,  0.0024, -0.0186,\n",
       "          0.0047,  0.0049, -0.0010, -0.0003,  0.0107,  0.0177,  0.0050, -0.0135,\n",
       "         -0.0340,  0.0087, -0.0088,  0.0095,  0.0003, -0.0241,  0.0107, -0.0112,\n",
       "         -0.0104, -0.0324, -0.0107, -0.0026, -0.0178, -0.0256,  0.0008,  0.0308,\n",
       "         -0.0261,  0.0049,  0.0251,  0.0018,  0.0185, -0.0225, -0.0320, -0.0180,\n",
       "          0.0243, -0.0325,  0.0308, -0.0012,  0.0176,  0.0168, -0.0343,  0.0179,\n",
       "         -0.0136, -0.0315,  0.0268,  0.0102,  0.0248, -0.0330,  0.0278, -0.0126,\n",
       "         -0.0318,  0.0086, -0.0203, -0.0315,  0.0166,  0.0348, -0.0139, -0.0049,\n",
       "         -0.0039,  0.0046,  0.0054, -0.0103,  0.0041, -0.0089, -0.0189,  0.0146,\n",
       "          0.0027, -0.0144,  0.0208,  0.0275,  0.0234, -0.0075,  0.0109, -0.0280,\n",
       "         -0.0343,  0.0029,  0.0107, -0.0092,  0.0002,  0.0114, -0.0258, -0.0326,\n",
       "          0.0320, -0.0251, -0.0278, -0.0145, -0.0019, -0.0240, -0.0089,  0.0343,\n",
       "          0.0138,  0.0280,  0.0303, -0.0184,  0.0050, -0.0057,  0.0157,  0.0081,\n",
       "          0.0119,  0.0058,  0.0107, -0.0215,  0.0338, -0.0340,  0.0193,  0.0104,\n",
       "         -0.0169, -0.0195, -0.0135,  0.0086,  0.0193, -0.0287,  0.0059, -0.0096,\n",
       "          0.0288, -0.0337,  0.0021, -0.0325, -0.0120,  0.0190,  0.0149,  0.0343,\n",
       "         -0.0173, -0.0050,  0.0210, -0.0142,  0.0146,  0.0037,  0.0277,  0.0142,\n",
       "          0.0263,  0.0206, -0.0016,  0.0171,  0.0346, -0.0282,  0.0274,  0.0192,\n",
       "         -0.0067, -0.0128,  0.0285, -0.0034], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 0.0513, -0.0361, -0.0484,  ..., -0.0507, -0.0298, -0.0384],\n",
       "         [-0.0485,  0.0294, -0.0349,  ..., -0.0036, -0.0414, -0.0109],\n",
       "         [-0.0345,  0.0426, -0.0303,  ...,  0.0430, -0.0010, -0.0433],\n",
       "         ...,\n",
       "         [ 0.0479, -0.0339,  0.0524,  ..., -0.0015,  0.0275,  0.0025],\n",
       "         [-0.0566, -0.0012, -0.0066,  ..., -0.0224, -0.0026, -0.0303],\n",
       "         [-0.0446,  0.0367,  0.0452,  ..., -0.0357,  0.0365,  0.0553]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0204, -0.0035,  0.0341, -0.0244,  0.0323,  0.0190,  0.0254, -0.0051,\n",
       "          0.0178, -0.0270,  0.0335, -0.0316, -0.0092, -0.0243, -0.0264, -0.0144,\n",
       "         -0.0140,  0.0124,  0.0183, -0.0053,  0.0543,  0.0277, -0.0339,  0.0350,\n",
       "          0.0319, -0.0093,  0.0173,  0.0534,  0.0419, -0.0550, -0.0227, -0.0485,\n",
       "          0.0508,  0.0010,  0.0173,  0.0173, -0.0256,  0.0092, -0.0489,  0.0076,\n",
       "          0.0563, -0.0259, -0.0257,  0.0095, -0.0331, -0.0335,  0.0479, -0.0327,\n",
       "          0.0238, -0.0063, -0.0403,  0.0340,  0.0461,  0.0101, -0.0436,  0.0007,\n",
       "         -0.0187,  0.0234,  0.0401, -0.0022, -0.0063,  0.0116,  0.0235,  0.0422,\n",
       "          0.0422,  0.0074, -0.0337, -0.0506, -0.0529,  0.0428,  0.0469,  0.0543,\n",
       "         -0.0497, -0.0473,  0.0557, -0.0163, -0.0227, -0.0163,  0.0212,  0.0382,\n",
       "          0.0394, -0.0229,  0.0244,  0.0415,  0.0060,  0.0172, -0.0507, -0.0076,\n",
       "         -0.0577,  0.0558,  0.0207, -0.0415,  0.0391,  0.0451, -0.0132, -0.0113,\n",
       "         -0.0200,  0.0191,  0.0311, -0.0186], requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([[ 2.1150e-02,  2.9527e-02,  8.7900e-02,  3.5378e-02,  2.0155e-03,\n",
       "           8.0275e-02, -7.3302e-02,  4.3237e-02,  5.3951e-02, -7.8065e-02,\n",
       "          -7.2917e-03,  2.1393e-02, -7.6819e-02, -3.2837e-03, -6.5596e-02,\n",
       "           2.4380e-02, -6.1495e-02,  8.8136e-02,  9.3106e-02, -7.7478e-02,\n",
       "          -8.0452e-02, -9.1098e-02, -3.4989e-02,  7.5624e-03,  8.9989e-03,\n",
       "          -5.9332e-02,  9.2986e-02, -2.8258e-02, -6.7900e-02, -5.2370e-02,\n",
       "          -1.4354e-03, -3.1840e-02, -1.0363e-02, -3.3919e-02, -3.7998e-03,\n",
       "           7.1448e-02, -5.4191e-02,  7.1837e-02,  5.9989e-02, -3.9716e-02,\n",
       "           7.3215e-02, -8.2317e-02,  4.9386e-03, -4.0131e-02,  9.9997e-02,\n",
       "          -6.3497e-02, -6.2546e-02, -8.9738e-02, -8.2907e-02, -9.9803e-02,\n",
       "          -6.5838e-02,  9.2393e-02, -4.7072e-02, -8.3512e-02,  5.4882e-02,\n",
       "          -4.1843e-02, -6.6982e-02, -4.8173e-02, -8.7617e-02,  3.4064e-02,\n",
       "           6.6234e-03, -7.8743e-02,  7.0260e-02,  8.4721e-02,  3.4100e-02,\n",
       "           1.5830e-02,  9.0396e-02, -6.0782e-02,  4.6894e-02, -8.6639e-02,\n",
       "          -7.4658e-03, -5.2191e-02,  1.9862e-02, -7.6207e-02, -8.4717e-02,\n",
       "          -6.7311e-02,  9.7226e-03,  3.6986e-03, -4.7962e-02, -8.5719e-02,\n",
       "           7.3376e-02,  2.5492e-02,  4.4676e-02,  5.4957e-02,  1.9074e-02,\n",
       "          -9.6258e-02,  7.1749e-02, -7.6790e-02, -8.7592e-02,  7.2297e-02,\n",
       "           1.3191e-02, -3.9468e-02,  5.2085e-04, -4.0409e-02, -6.5912e-02,\n",
       "           4.0986e-02,  9.0001e-02,  1.2358e-02,  3.0363e-02,  1.9557e-03],\n",
       "         [ 7.4316e-02, -4.7283e-02, -2.1147e-02, -4.5680e-03, -6.0027e-02,\n",
       "          -1.2271e-04, -3.2597e-03,  8.4690e-02, -9.8965e-02,  1.8292e-02,\n",
       "          -5.0926e-02, -4.6823e-02,  9.6457e-02,  8.4679e-02, -1.1951e-02,\n",
       "          -9.7150e-02,  6.6340e-02,  9.2192e-02, -1.4788e-03, -6.0757e-02,\n",
       "           4.8797e-02,  5.3173e-02, -2.2521e-02, -2.6398e-03, -9.1854e-03,\n",
       "          -1.5823e-02,  8.0475e-02, -6.3254e-02,  7.7569e-02, -3.1185e-02,\n",
       "           1.8948e-02, -2.0799e-03,  7.0261e-02, -1.8295e-02,  4.9377e-02,\n",
       "          -8.9757e-02,  7.7575e-02, -8.6476e-02,  2.5247e-02, -7.3152e-02,\n",
       "           9.5242e-02, -8.8263e-02,  1.9138e-03, -4.2967e-02, -3.4036e-02,\n",
       "           9.9563e-02, -3.1955e-02,  2.9185e-02,  3.9003e-02, -8.5769e-02,\n",
       "           5.3939e-02, -2.1393e-02, -9.4698e-02,  9.8287e-03,  5.1306e-02,\n",
       "           2.2546e-02,  1.5037e-02, -8.0112e-02,  7.2723e-02, -8.4064e-02,\n",
       "          -7.9647e-02, -8.1458e-03,  7.1759e-02,  1.2730e-02,  5.9627e-02,\n",
       "           5.5886e-02,  8.1881e-02,  5.5059e-02,  1.6905e-02, -8.5582e-02,\n",
       "          -1.9679e-02,  8.9604e-02,  4.2435e-02,  4.0114e-02, -9.6083e-02,\n",
       "           1.6023e-02, -8.7356e-02, -3.0930e-02,  3.6186e-02, -3.6123e-02,\n",
       "           6.5166e-02, -9.1631e-02,  8.9549e-02,  8.7183e-02,  7.4634e-02,\n",
       "          -2.5542e-02, -2.6253e-02,  5.6361e-02, -9.2268e-03,  4.2366e-03,\n",
       "           8.8593e-02,  8.1453e-03, -2.2176e-02, -8.9729e-02, -5.9396e-02,\n",
       "          -8.3460e-02,  5.4759e-02,  7.9405e-02, -1.1613e-02,  3.9154e-03],\n",
       "         [-3.4798e-02,  7.1688e-02, -9.6238e-02, -2.1878e-02, -1.6041e-02,\n",
       "           4.8025e-02,  8.5148e-02, -2.4379e-02,  9.1640e-02,  8.5878e-04,\n",
       "          -6.8684e-02,  2.4096e-02, -3.3839e-02, -8.5481e-02, -4.3937e-02,\n",
       "          -4.8431e-02,  1.3697e-02, -3.1405e-02,  5.3119e-02,  7.7526e-02,\n",
       "           9.3044e-02, -2.1765e-02,  3.2879e-02, -3.9129e-02, -5.6999e-02,\n",
       "          -3.1815e-02,  3.5047e-02,  7.3295e-02, -1.0828e-02,  4.2106e-04,\n",
       "           9.7416e-02,  7.8882e-02,  5.9813e-02, -7.6005e-02, -2.7058e-02,\n",
       "          -9.0985e-02,  6.9144e-02, -9.4429e-02,  7.9117e-02, -1.2647e-02,\n",
       "           4.8606e-02,  6.2938e-03, -6.0867e-02, -8.6489e-02,  8.7113e-02,\n",
       "          -7.4404e-02, -2.6330e-02,  4.5242e-02,  2.6464e-02,  1.6341e-02,\n",
       "          -5.6333e-02,  1.2461e-02,  1.3445e-02,  7.6695e-02, -2.1207e-02,\n",
       "          -2.6927e-02, -8.4875e-02,  3.1415e-02,  6.7293e-02,  8.3754e-02,\n",
       "           5.8478e-02, -1.6617e-02,  3.8618e-02, -7.2580e-02,  7.5697e-03,\n",
       "           6.7990e-03, -2.9184e-02, -9.8921e-02, -1.1811e-02, -9.4913e-02,\n",
       "          -7.4985e-02, -4.5612e-02,  8.5575e-02, -1.9439e-02,  3.9289e-02,\n",
       "           3.9233e-02,  9.9319e-02,  5.0684e-03, -2.6759e-02,  8.7110e-02,\n",
       "           7.1203e-02,  6.3406e-02, -1.3489e-02,  2.6404e-02, -7.9519e-02,\n",
       "           1.1064e-02, -8.1368e-02,  8.6307e-02,  9.1425e-02, -7.1142e-02,\n",
       "           4.8220e-02, -1.4438e-02, -1.2108e-02,  1.3381e-02,  8.4416e-02,\n",
       "          -6.5263e-02,  2.3883e-02, -5.1343e-02,  8.7909e-02, -4.7940e-02],\n",
       "         [ 2.7827e-02, -1.1469e-02, -9.7102e-02, -4.5945e-02,  3.7090e-03,\n",
       "          -2.6186e-02,  3.3741e-02,  7.8327e-02, -6.2320e-02, -8.0161e-02,\n",
       "          -9.6649e-02, -6.2130e-02,  4.0724e-02,  4.0273e-02,  6.3075e-02,\n",
       "           4.9413e-02, -5.8846e-02, -3.5859e-02,  4.4722e-02,  9.7996e-02,\n",
       "           8.4778e-02,  8.5285e-02,  3.7230e-02,  3.1763e-02, -3.3615e-02,\n",
       "           7.5885e-02, -6.3433e-02, -8.3681e-02,  2.5550e-02, -2.1036e-02,\n",
       "           4.4882e-02, -4.5506e-02, -8.3456e-03, -9.6378e-02,  2.4603e-02,\n",
       "           7.6775e-02, -4.9380e-02, -8.2466e-02,  1.9352e-02, -7.2835e-02,\n",
       "          -1.2716e-02, -9.7795e-02, -1.9127e-02,  4.4196e-02, -5.1582e-02,\n",
       "          -8.4968e-02,  3.8181e-02,  2.0923e-02, -2.3358e-02,  5.1537e-03,\n",
       "          -5.2837e-02,  7.6867e-02, -6.5125e-02,  3.9345e-02, -9.6399e-02,\n",
       "          -5.9323e-02, -7.5874e-02, -7.2675e-02,  4.0534e-02, -7.1627e-02,\n",
       "          -1.2192e-02,  3.2040e-02, -5.8279e-03,  3.5603e-03,  4.5029e-02,\n",
       "           1.5228e-02, -6.3042e-02, -2.0135e-03, -3.5279e-02, -5.6562e-02,\n",
       "           1.5017e-02,  1.3406e-02, -2.7314e-02, -2.8235e-02, -7.2622e-03,\n",
       "           5.2096e-02,  1.4695e-02,  7.7038e-02,  9.7532e-02,  9.1463e-02,\n",
       "          -6.7070e-02,  2.0021e-02,  8.0271e-02,  3.3620e-02,  6.2281e-02,\n",
       "          -8.8614e-02, -8.3221e-02,  6.1925e-02, -8.5266e-02, -6.2464e-02,\n",
       "          -1.0248e-02,  5.4973e-02,  6.6487e-02,  5.9272e-02, -7.2988e-02,\n",
       "          -1.3908e-02, -4.5376e-02, -4.4076e-02, -6.6564e-02, -9.9448e-02],\n",
       "         [-3.1262e-02, -6.6631e-02,  2.9524e-02, -6.1023e-02,  5.7160e-02,\n",
       "          -9.4767e-02, -9.2958e-02, -3.3356e-02,  9.5141e-02,  2.6430e-02,\n",
       "          -5.4213e-02,  7.7522e-02,  2.3278e-02, -3.2220e-02,  6.6378e-03,\n",
       "          -1.0090e-03, -8.9399e-02, -5.3077e-02,  2.7130e-02,  1.7080e-02,\n",
       "           3.9743e-02,  6.7350e-02, -4.7272e-02,  1.2871e-02, -2.8621e-02,\n",
       "          -2.4401e-02, -9.5107e-05, -9.2366e-03,  9.0874e-02,  7.2212e-02,\n",
       "          -9.4674e-02, -3.5570e-03, -3.4211e-02, -5.5884e-02,  9.5935e-02,\n",
       "           4.5744e-02,  4.8629e-02,  5.7982e-02,  2.6445e-02, -5.9679e-02,\n",
       "          -5.1274e-02, -3.1868e-02,  6.0861e-02, -3.1090e-02, -7.7177e-02,\n",
       "          -2.3810e-02, -1.0758e-02, -3.0101e-03, -1.8018e-02, -6.5560e-03,\n",
       "          -6.5183e-02,  3.9790e-02, -1.3455e-02,  7.3681e-02, -2.0760e-02,\n",
       "           7.1405e-02,  8.0200e-02, -6.7373e-02, -8.5167e-02, -7.6572e-03,\n",
       "          -8.7931e-02,  6.4871e-02,  3.4392e-02,  7.9725e-02, -5.5729e-02,\n",
       "           1.6313e-02, -5.9628e-02,  4.9435e-02,  6.7778e-02,  6.9083e-02,\n",
       "           6.2804e-02, -4.5711e-02, -2.7930e-02, -7.6043e-02,  8.8622e-02,\n",
       "           8.7977e-03, -2.7620e-02, -1.4938e-02, -9.7226e-02, -9.9607e-02,\n",
       "           4.9642e-02, -3.7584e-02, -6.8043e-02, -2.8916e-02, -9.8664e-02,\n",
       "           9.8107e-02,  6.9992e-02,  9.4596e-02, -3.8248e-02,  6.5898e-02,\n",
       "          -5.0680e-02,  5.5015e-02,  8.9211e-02,  5.0154e-02, -7.6337e-02,\n",
       "           4.7984e-02,  9.9856e-02, -8.8466e-02, -2.7005e-02, -5.8521e-02],\n",
       "         [ 3.7593e-02, -3.1089e-02,  2.5036e-02, -4.4240e-03,  5.9752e-02,\n",
       "           4.1841e-02, -3.7123e-03, -1.2879e-02, -2.7479e-02,  3.4676e-02,\n",
       "          -5.0929e-02, -1.8724e-02, -9.7202e-02, -8.3314e-02, -5.0216e-02,\n",
       "           7.0868e-02, -5.9692e-02,  9.6693e-02, -8.2368e-02,  5.2901e-02,\n",
       "           8.2619e-02, -3.3596e-02,  7.3814e-02,  6.5059e-02,  4.3535e-02,\n",
       "          -5.5748e-02,  8.6255e-02,  4.1750e-02,  6.4224e-02, -9.0819e-02,\n",
       "           2.3945e-02,  3.5285e-02, -2.4884e-02,  6.7267e-02,  8.6971e-02,\n",
       "           3.5456e-02, -9.4676e-02,  1.8029e-02, -3.3303e-02,  2.7799e-03,\n",
       "           3.3639e-02,  5.9836e-02, -4.7821e-02, -9.2199e-02, -4.7181e-02,\n",
       "          -1.2798e-02,  7.9150e-02,  5.4727e-02, -7.4529e-03, -2.3881e-04,\n",
       "          -4.1294e-02, -6.7017e-02, -2.3152e-03,  3.3279e-02,  2.0999e-02,\n",
       "           4.0848e-02,  1.6144e-02,  6.9930e-02,  1.0486e-02,  9.9744e-02,\n",
       "          -1.3204e-02, -4.3243e-02, -1.8375e-02,  4.8898e-02, -6.0826e-02,\n",
       "           7.6468e-02, -4.4835e-02,  4.0011e-02, -4.6876e-02, -5.5612e-03,\n",
       "          -8.2746e-02,  8.9566e-02, -8.2584e-02,  4.1025e-02, -8.7650e-02,\n",
       "          -7.2063e-02, -3.6065e-02,  3.9355e-02, -3.2594e-02, -4.1054e-02,\n",
       "          -8.3382e-02, -6.4334e-02, -7.6834e-02,  4.9103e-02, -2.1044e-02,\n",
       "          -6.3009e-02,  4.0924e-02, -8.7054e-02,  9.2662e-02, -3.0519e-02,\n",
       "           9.7471e-02, -9.0429e-02,  5.7905e-02, -5.1088e-03,  6.6026e-03,\n",
       "           5.6491e-02, -4.6291e-02,  8.5962e-02, -1.2815e-02, -3.0915e-02],\n",
       "         [-9.3582e-02,  1.7228e-02, -1.1633e-02,  6.3671e-02, -3.2830e-02,\n",
       "          -5.8598e-02, -4.3250e-02, -1.1449e-02, -8.8387e-02, -4.7103e-02,\n",
       "           7.5432e-02,  1.9466e-02, -6.5523e-02, -1.1648e-02,  5.5656e-02,\n",
       "          -3.3535e-02,  7.2543e-02, -3.2294e-02, -1.5061e-02, -4.2211e-02,\n",
       "          -1.1998e-02,  8.0857e-02, -7.3933e-02, -5.9826e-02, -1.5970e-02,\n",
       "          -2.2018e-02,  6.6600e-02, -3.9302e-02,  7.7290e-02, -7.5449e-02,\n",
       "           3.1214e-02, -4.1057e-02, -9.4033e-03,  1.5747e-02,  3.5555e-02,\n",
       "           6.6079e-02,  1.7799e-02, -7.3818e-02,  5.8827e-02, -3.5294e-02,\n",
       "          -5.4471e-02,  1.3014e-02,  8.3136e-02,  9.9490e-02, -7.7888e-02,\n",
       "          -3.6760e-02,  6.2831e-02, -4.1676e-02,  9.1309e-02,  5.1643e-02,\n",
       "           6.9433e-02,  6.3024e-02, -7.6546e-02, -1.0834e-02, -9.7825e-02,\n",
       "           1.0553e-02, -4.8155e-02, -4.3341e-02, -8.6495e-02, -9.9697e-02,\n",
       "          -5.4479e-02, -4.3627e-02,  9.2338e-02, -4.6409e-02,  6.7574e-02,\n",
       "          -8.4370e-02, -9.0139e-02,  2.4736e-03, -3.9665e-02, -7.0764e-03,\n",
       "          -3.7192e-02,  6.8221e-02, -1.9810e-02, -2.6637e-02, -9.5572e-02,\n",
       "          -3.5461e-02,  3.7869e-02, -3.2200e-02, -1.3781e-02,  5.0253e-02,\n",
       "           7.4216e-03, -6.3810e-02, -1.6652e-02,  5.8102e-02, -6.1930e-02,\n",
       "          -4.8951e-02,  6.3206e-02,  7.7405e-02,  2.0546e-02, -5.8581e-02,\n",
       "          -5.7572e-02, -3.1734e-02,  8.3900e-02, -5.3068e-02,  8.7080e-02,\n",
       "          -1.9179e-02,  4.9676e-03,  9.1313e-02, -2.2561e-02,  2.4890e-02],\n",
       "         [-9.6688e-02, -2.9981e-02,  5.1407e-03,  5.6160e-02,  9.6117e-03,\n",
       "          -2.5627e-02, -4.7792e-02, -9.0432e-02, -6.7610e-02,  3.9604e-03,\n",
       "          -3.0132e-02,  3.9348e-02, -7.9343e-02, -7.5823e-02, -1.1383e-02,\n",
       "           1.5774e-02, -3.9616e-02,  1.2969e-02,  1.7376e-02,  4.0553e-02,\n",
       "          -5.4318e-03,  9.8938e-02, -7.3064e-02,  6.3894e-02, -4.1975e-02,\n",
       "           9.4080e-02, -3.4331e-02,  1.2772e-02, -1.4732e-02, -6.8617e-02,\n",
       "           7.3802e-02, -3.5796e-02,  7.7235e-03,  2.2911e-02,  7.4367e-02,\n",
       "           3.2385e-02, -6.1735e-02, -1.9411e-02,  8.3894e-02,  4.9785e-02,\n",
       "           3.4444e-02,  3.0888e-02, -9.5824e-02, -5.7070e-03,  1.5657e-03,\n",
       "           9.9298e-02, -8.5389e-02, -5.2430e-02,  9.7990e-02,  9.5673e-02,\n",
       "          -1.4951e-02, -2.6868e-04,  4.9158e-02,  9.7411e-02,  9.9308e-02,\n",
       "          -7.0282e-02,  3.1580e-02, -8.7752e-02, -3.7506e-02,  6.6077e-02,\n",
       "          -6.5963e-02, -8.2309e-02,  3.2092e-02, -6.9650e-02,  4.5463e-02,\n",
       "           9.1953e-02,  4.5219e-02, -7.0945e-02, -2.2132e-02,  5.8128e-02,\n",
       "           9.1723e-02, -9.6537e-03,  1.6802e-02, -4.8279e-02, -3.0549e-02,\n",
       "           3.0292e-02, -5.5015e-02, -3.2044e-02, -7.5170e-02, -4.7071e-03,\n",
       "           8.0306e-02,  4.5042e-02, -7.7147e-02, -5.0411e-04,  1.9141e-02,\n",
       "          -6.9223e-02, -7.0964e-02, -4.1757e-02,  7.2602e-02,  6.6683e-02,\n",
       "          -1.6199e-03, -9.0731e-02, -8.4823e-02,  8.7276e-02,  4.1309e-02,\n",
       "           4.4045e-02, -5.3301e-02, -7.4710e-03, -5.4882e-02, -6.4691e-02],\n",
       "         [-9.0806e-02, -4.2254e-02,  2.6332e-03, -1.9242e-02, -5.7614e-02,\n",
       "          -2.6726e-02, -9.7431e-02,  5.5080e-02, -4.5619e-02, -6.2399e-02,\n",
       "          -2.1042e-02,  4.2885e-02,  3.1430e-02,  1.1054e-02,  6.2751e-02,\n",
       "           7.0543e-02, -8.6463e-03,  5.6838e-02,  9.6467e-02, -2.3790e-02,\n",
       "           1.4696e-02,  1.7046e-03,  6.0199e-02,  1.6078e-02, -7.2888e-02,\n",
       "           9.2494e-02,  7.4091e-02, -4.3504e-02,  9.7285e-02, -7.5916e-02,\n",
       "           4.5151e-02, -2.4244e-02,  7.6203e-02,  8.9228e-02,  5.1742e-02,\n",
       "           9.4354e-02, -7.3001e-02,  9.5834e-02,  4.3686e-02, -4.0123e-02,\n",
       "          -6.3766e-02, -4.3652e-02,  2.3386e-02, -5.1906e-02,  8.4648e-02,\n",
       "           6.8081e-02, -8.9303e-02, -5.7047e-02, -3.4539e-02, -9.2489e-02,\n",
       "           5.1871e-03, -1.9002e-03, -7.6727e-02,  8.5329e-02,  5.4396e-02,\n",
       "          -6.1735e-02,  5.5555e-02, -3.8917e-03, -5.0648e-02,  7.7824e-02,\n",
       "          -7.8288e-02,  5.9262e-02, -2.9057e-02, -1.7409e-02, -2.3704e-02,\n",
       "          -9.1592e-02,  8.3031e-02,  3.4634e-02, -7.2933e-02,  4.8683e-02,\n",
       "           2.2976e-02,  5.9563e-02,  6.2457e-02,  9.6588e-02, -6.3084e-02,\n",
       "           6.6453e-02, -8.4374e-02,  6.5838e-03, -8.9410e-02, -6.8432e-03,\n",
       "           1.5982e-03,  4.1390e-02,  2.0636e-02, -3.8100e-02,  4.9125e-02,\n",
       "           8.4511e-02, -3.2430e-02, -2.2517e-03, -8.1667e-02, -3.9426e-02,\n",
       "           3.2008e-02, -6.0298e-02, -4.5742e-03,  6.3969e-02, -9.6848e-02,\n",
       "          -1.2591e-02,  2.9569e-02,  7.0861e-02, -1.9956e-03, -1.0980e-02],\n",
       "         [-9.4103e-02, -3.5877e-02,  4.6626e-02, -8.0206e-02,  8.6257e-02,\n",
       "          -3.6922e-02, -8.6712e-02, -1.2848e-02,  4.5402e-02, -7.1383e-02,\n",
       "           8.0495e-02, -6.9596e-03,  9.7850e-02, -3.9891e-02, -5.2837e-02,\n",
       "           7.1624e-03,  1.8160e-02,  8.0040e-03, -6.1718e-02, -7.0888e-02,\n",
       "          -9.9979e-03, -8.2293e-02, -3.7021e-03,  2.5398e-02,  3.2238e-02,\n",
       "          -7.2920e-02, -5.4611e-02,  7.8534e-02, -7.8137e-02,  9.1311e-03,\n",
       "           5.5462e-02,  2.6647e-02, -6.7877e-02, -7.2888e-02,  5.2312e-03,\n",
       "          -6.9704e-02,  6.1361e-03,  4.9413e-02, -2.0117e-02, -2.3962e-02,\n",
       "          -4.6552e-02, -2.5030e-02,  6.2391e-02, -9.7488e-02, -4.9702e-02,\n",
       "           1.4607e-02, -9.1653e-02, -1.8422e-02, -8.5919e-02,  2.1384e-02,\n",
       "          -1.2945e-03, -1.3531e-02,  1.6738e-02, -8.0020e-02, -2.8144e-02,\n",
       "          -7.5980e-02,  7.8555e-02, -3.1243e-02,  5.7787e-02,  1.6620e-02,\n",
       "          -2.7134e-02, -4.1060e-02, -2.4212e-02, -9.6689e-02, -9.3730e-02,\n",
       "          -1.6249e-02, -6.4755e-02,  3.7203e-02, -2.1032e-03,  5.8220e-02,\n",
       "          -9.5702e-03,  7.7521e-02,  5.1173e-04,  8.1313e-02,  9.4036e-02,\n",
       "           7.6560e-02, -6.0602e-02, -9.4725e-02,  7.4830e-02,  3.3819e-02,\n",
       "           4.1148e-02, -3.4041e-02, -2.1886e-02,  9.0899e-02, -2.6571e-02,\n",
       "          -5.7989e-02,  5.1823e-02,  6.5062e-02,  5.8190e-02,  3.5404e-02,\n",
       "          -5.6346e-02, -4.6502e-02, -9.3984e-03,  6.0086e-02, -4.3050e-02,\n",
       "          -8.3520e-02, -4.4842e-02, -7.9770e-02,  8.3293e-02, -3.2302e-02]],\n",
       "        requires_grad=True),\n",
       " Parameter containing:\n",
       " tensor([-0.0502,  0.0065,  0.0772,  0.0176,  0.0603, -0.0319,  0.0347,  0.0165,\n",
       "         -0.0455, -0.0817], requires_grad=True)]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 80
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.729429Z",
     "start_time": "2025-01-19T12:12:32.708552Z"
    }
   },
   "source": "model.state_dict()  # 这种方法用于保存模型参数，看能看见参数属于模型的哪一部分",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "OrderedDict([('linear_relu_stack.0.weight',\n",
       "              tensor([[ 0.0194,  0.0071,  0.0132,  ...,  0.0105,  0.0066,  0.0332],\n",
       "                      [ 0.0296, -0.0179, -0.0133,  ..., -0.0084,  0.0193,  0.0163],\n",
       "                      [-0.0186, -0.0100,  0.0181,  ..., -0.0215, -0.0124, -0.0057],\n",
       "                      ...,\n",
       "                      [ 0.0029, -0.0280,  0.0258,  ...,  0.0185, -0.0224,  0.0348],\n",
       "                      [-0.0326,  0.0349,  0.0173,  ..., -0.0334,  0.0291, -0.0339],\n",
       "                      [ 0.0238, -0.0110, -0.0185,  ...,  0.0112,  0.0116,  0.0099]])),\n",
       "             ('linear_relu_stack.0.bias',\n",
       "              tensor([-0.0355, -0.0169,  0.0218, -0.0068, -0.0183,  0.0309, -0.0183, -0.0111,\n",
       "                      -0.0174,  0.0150, -0.0317,  0.0211,  0.0135, -0.0002,  0.0026, -0.0264,\n",
       "                      -0.0213,  0.0250, -0.0315, -0.0019, -0.0062,  0.0082,  0.0161, -0.0161,\n",
       "                      -0.0112,  0.0291, -0.0071,  0.0193,  0.0292, -0.0078, -0.0177, -0.0012,\n",
       "                       0.0108,  0.0114,  0.0249, -0.0157, -0.0142, -0.0192,  0.0250,  0.0079,\n",
       "                      -0.0059,  0.0327, -0.0155, -0.0009,  0.0098, -0.0129,  0.0160, -0.0104,\n",
       "                      -0.0012,  0.0144,  0.0044, -0.0284, -0.0213, -0.0029,  0.0102, -0.0305,\n",
       "                       0.0286,  0.0005,  0.0051, -0.0128, -0.0169,  0.0354,  0.0190,  0.0199,\n",
       "                      -0.0301,  0.0298,  0.0123, -0.0170, -0.0036,  0.0203, -0.0156, -0.0034,\n",
       "                      -0.0110,  0.0042,  0.0286, -0.0345,  0.0241, -0.0315,  0.0119, -0.0194,\n",
       "                      -0.0255,  0.0232,  0.0324,  0.0005, -0.0135, -0.0317,  0.0324, -0.0326,\n",
       "                      -0.0200,  0.0206, -0.0209,  0.0065,  0.0094,  0.0018,  0.0161,  0.0269,\n",
       "                       0.0042, -0.0227, -0.0062, -0.0012,  0.0024,  0.0351,  0.0193, -0.0289,\n",
       "                      -0.0253, -0.0256, -0.0303,  0.0059,  0.0078, -0.0261, -0.0104, -0.0080,\n",
       "                      -0.0034, -0.0007,  0.0285,  0.0223,  0.0335,  0.0048, -0.0176,  0.0178,\n",
       "                       0.0040,  0.0241, -0.0161, -0.0225, -0.0280, -0.0294, -0.0297,  0.0333,\n",
       "                      -0.0188,  0.0322, -0.0220, -0.0178,  0.0103,  0.0028,  0.0036,  0.0042,\n",
       "                       0.0302,  0.0199, -0.0097,  0.0306, -0.0041,  0.0130,  0.0177, -0.0227,\n",
       "                      -0.0003, -0.0212, -0.0349, -0.0184, -0.0050,  0.0231,  0.0068,  0.0111,\n",
       "                       0.0023,  0.0185, -0.0300,  0.0088, -0.0214,  0.0009,  0.0024, -0.0186,\n",
       "                       0.0047,  0.0049, -0.0010, -0.0003,  0.0107,  0.0177,  0.0050, -0.0135,\n",
       "                      -0.0340,  0.0087, -0.0088,  0.0095,  0.0003, -0.0241,  0.0107, -0.0112,\n",
       "                      -0.0104, -0.0324, -0.0107, -0.0026, -0.0178, -0.0256,  0.0008,  0.0308,\n",
       "                      -0.0261,  0.0049,  0.0251,  0.0018,  0.0185, -0.0225, -0.0320, -0.0180,\n",
       "                       0.0243, -0.0325,  0.0308, -0.0012,  0.0176,  0.0168, -0.0343,  0.0179,\n",
       "                      -0.0136, -0.0315,  0.0268,  0.0102,  0.0248, -0.0330,  0.0278, -0.0126,\n",
       "                      -0.0318,  0.0086, -0.0203, -0.0315,  0.0166,  0.0348, -0.0139, -0.0049,\n",
       "                      -0.0039,  0.0046,  0.0054, -0.0103,  0.0041, -0.0089, -0.0189,  0.0146,\n",
       "                       0.0027, -0.0144,  0.0208,  0.0275,  0.0234, -0.0075,  0.0109, -0.0280,\n",
       "                      -0.0343,  0.0029,  0.0107, -0.0092,  0.0002,  0.0114, -0.0258, -0.0326,\n",
       "                       0.0320, -0.0251, -0.0278, -0.0145, -0.0019, -0.0240, -0.0089,  0.0343,\n",
       "                       0.0138,  0.0280,  0.0303, -0.0184,  0.0050, -0.0057,  0.0157,  0.0081,\n",
       "                       0.0119,  0.0058,  0.0107, -0.0215,  0.0338, -0.0340,  0.0193,  0.0104,\n",
       "                      -0.0169, -0.0195, -0.0135,  0.0086,  0.0193, -0.0287,  0.0059, -0.0096,\n",
       "                       0.0288, -0.0337,  0.0021, -0.0325, -0.0120,  0.0190,  0.0149,  0.0343,\n",
       "                      -0.0173, -0.0050,  0.0210, -0.0142,  0.0146,  0.0037,  0.0277,  0.0142,\n",
       "                       0.0263,  0.0206, -0.0016,  0.0171,  0.0346, -0.0282,  0.0274,  0.0192,\n",
       "                      -0.0067, -0.0128,  0.0285, -0.0034])),\n",
       "             ('linear_relu_stack.2.weight',\n",
       "              tensor([[ 0.0513, -0.0361, -0.0484,  ..., -0.0507, -0.0298, -0.0384],\n",
       "                      [-0.0485,  0.0294, -0.0349,  ..., -0.0036, -0.0414, -0.0109],\n",
       "                      [-0.0345,  0.0426, -0.0303,  ...,  0.0430, -0.0010, -0.0433],\n",
       "                      ...,\n",
       "                      [ 0.0479, -0.0339,  0.0524,  ..., -0.0015,  0.0275,  0.0025],\n",
       "                      [-0.0566, -0.0012, -0.0066,  ..., -0.0224, -0.0026, -0.0303],\n",
       "                      [-0.0446,  0.0367,  0.0452,  ..., -0.0357,  0.0365,  0.0553]])),\n",
       "             ('linear_relu_stack.2.bias',\n",
       "              tensor([-0.0204, -0.0035,  0.0341, -0.0244,  0.0323,  0.0190,  0.0254, -0.0051,\n",
       "                       0.0178, -0.0270,  0.0335, -0.0316, -0.0092, -0.0243, -0.0264, -0.0144,\n",
       "                      -0.0140,  0.0124,  0.0183, -0.0053,  0.0543,  0.0277, -0.0339,  0.0350,\n",
       "                       0.0319, -0.0093,  0.0173,  0.0534,  0.0419, -0.0550, -0.0227, -0.0485,\n",
       "                       0.0508,  0.0010,  0.0173,  0.0173, -0.0256,  0.0092, -0.0489,  0.0076,\n",
       "                       0.0563, -0.0259, -0.0257,  0.0095, -0.0331, -0.0335,  0.0479, -0.0327,\n",
       "                       0.0238, -0.0063, -0.0403,  0.0340,  0.0461,  0.0101, -0.0436,  0.0007,\n",
       "                      -0.0187,  0.0234,  0.0401, -0.0022, -0.0063,  0.0116,  0.0235,  0.0422,\n",
       "                       0.0422,  0.0074, -0.0337, -0.0506, -0.0529,  0.0428,  0.0469,  0.0543,\n",
       "                      -0.0497, -0.0473,  0.0557, -0.0163, -0.0227, -0.0163,  0.0212,  0.0382,\n",
       "                       0.0394, -0.0229,  0.0244,  0.0415,  0.0060,  0.0172, -0.0507, -0.0076,\n",
       "                      -0.0577,  0.0558,  0.0207, -0.0415,  0.0391,  0.0451, -0.0132, -0.0113,\n",
       "                      -0.0200,  0.0191,  0.0311, -0.0186])),\n",
       "             ('linear_relu_stack.4.weight',\n",
       "              tensor([[ 2.1150e-02,  2.9527e-02,  8.7900e-02,  3.5378e-02,  2.0155e-03,\n",
       "                        8.0275e-02, -7.3302e-02,  4.3237e-02,  5.3951e-02, -7.8065e-02,\n",
       "                       -7.2917e-03,  2.1393e-02, -7.6819e-02, -3.2837e-03, -6.5596e-02,\n",
       "                        2.4380e-02, -6.1495e-02,  8.8136e-02,  9.3106e-02, -7.7478e-02,\n",
       "                       -8.0452e-02, -9.1098e-02, -3.4989e-02,  7.5624e-03,  8.9989e-03,\n",
       "                       -5.9332e-02,  9.2986e-02, -2.8258e-02, -6.7900e-02, -5.2370e-02,\n",
       "                       -1.4354e-03, -3.1840e-02, -1.0363e-02, -3.3919e-02, -3.7998e-03,\n",
       "                        7.1448e-02, -5.4191e-02,  7.1837e-02,  5.9989e-02, -3.9716e-02,\n",
       "                        7.3215e-02, -8.2317e-02,  4.9386e-03, -4.0131e-02,  9.9997e-02,\n",
       "                       -6.3497e-02, -6.2546e-02, -8.9738e-02, -8.2907e-02, -9.9803e-02,\n",
       "                       -6.5838e-02,  9.2393e-02, -4.7072e-02, -8.3512e-02,  5.4882e-02,\n",
       "                       -4.1843e-02, -6.6982e-02, -4.8173e-02, -8.7617e-02,  3.4064e-02,\n",
       "                        6.6234e-03, -7.8743e-02,  7.0260e-02,  8.4721e-02,  3.4100e-02,\n",
       "                        1.5830e-02,  9.0396e-02, -6.0782e-02,  4.6894e-02, -8.6639e-02,\n",
       "                       -7.4658e-03, -5.2191e-02,  1.9862e-02, -7.6207e-02, -8.4717e-02,\n",
       "                       -6.7311e-02,  9.7226e-03,  3.6986e-03, -4.7962e-02, -8.5719e-02,\n",
       "                        7.3376e-02,  2.5492e-02,  4.4676e-02,  5.4957e-02,  1.9074e-02,\n",
       "                       -9.6258e-02,  7.1749e-02, -7.6790e-02, -8.7592e-02,  7.2297e-02,\n",
       "                        1.3191e-02, -3.9468e-02,  5.2085e-04, -4.0409e-02, -6.5912e-02,\n",
       "                        4.0986e-02,  9.0001e-02,  1.2358e-02,  3.0363e-02,  1.9557e-03],\n",
       "                      [ 7.4316e-02, -4.7283e-02, -2.1147e-02, -4.5680e-03, -6.0027e-02,\n",
       "                       -1.2271e-04, -3.2597e-03,  8.4690e-02, -9.8965e-02,  1.8292e-02,\n",
       "                       -5.0926e-02, -4.6823e-02,  9.6457e-02,  8.4679e-02, -1.1951e-02,\n",
       "                       -9.7150e-02,  6.6340e-02,  9.2192e-02, -1.4788e-03, -6.0757e-02,\n",
       "                        4.8797e-02,  5.3173e-02, -2.2521e-02, -2.6398e-03, -9.1854e-03,\n",
       "                       -1.5823e-02,  8.0475e-02, -6.3254e-02,  7.7569e-02, -3.1185e-02,\n",
       "                        1.8948e-02, -2.0799e-03,  7.0261e-02, -1.8295e-02,  4.9377e-02,\n",
       "                       -8.9757e-02,  7.7575e-02, -8.6476e-02,  2.5247e-02, -7.3152e-02,\n",
       "                        9.5242e-02, -8.8263e-02,  1.9138e-03, -4.2967e-02, -3.4036e-02,\n",
       "                        9.9563e-02, -3.1955e-02,  2.9185e-02,  3.9003e-02, -8.5769e-02,\n",
       "                        5.3939e-02, -2.1393e-02, -9.4698e-02,  9.8287e-03,  5.1306e-02,\n",
       "                        2.2546e-02,  1.5037e-02, -8.0112e-02,  7.2723e-02, -8.4064e-02,\n",
       "                       -7.9647e-02, -8.1458e-03,  7.1759e-02,  1.2730e-02,  5.9627e-02,\n",
       "                        5.5886e-02,  8.1881e-02,  5.5059e-02,  1.6905e-02, -8.5582e-02,\n",
       "                       -1.9679e-02,  8.9604e-02,  4.2435e-02,  4.0114e-02, -9.6083e-02,\n",
       "                        1.6023e-02, -8.7356e-02, -3.0930e-02,  3.6186e-02, -3.6123e-02,\n",
       "                        6.5166e-02, -9.1631e-02,  8.9549e-02,  8.7183e-02,  7.4634e-02,\n",
       "                       -2.5542e-02, -2.6253e-02,  5.6361e-02, -9.2268e-03,  4.2366e-03,\n",
       "                        8.8593e-02,  8.1453e-03, -2.2176e-02, -8.9729e-02, -5.9396e-02,\n",
       "                       -8.3460e-02,  5.4759e-02,  7.9405e-02, -1.1613e-02,  3.9154e-03],\n",
       "                      [-3.4798e-02,  7.1688e-02, -9.6238e-02, -2.1878e-02, -1.6041e-02,\n",
       "                        4.8025e-02,  8.5148e-02, -2.4379e-02,  9.1640e-02,  8.5878e-04,\n",
       "                       -6.8684e-02,  2.4096e-02, -3.3839e-02, -8.5481e-02, -4.3937e-02,\n",
       "                       -4.8431e-02,  1.3697e-02, -3.1405e-02,  5.3119e-02,  7.7526e-02,\n",
       "                        9.3044e-02, -2.1765e-02,  3.2879e-02, -3.9129e-02, -5.6999e-02,\n",
       "                       -3.1815e-02,  3.5047e-02,  7.3295e-02, -1.0828e-02,  4.2106e-04,\n",
       "                        9.7416e-02,  7.8882e-02,  5.9813e-02, -7.6005e-02, -2.7058e-02,\n",
       "                       -9.0985e-02,  6.9144e-02, -9.4429e-02,  7.9117e-02, -1.2647e-02,\n",
       "                        4.8606e-02,  6.2938e-03, -6.0867e-02, -8.6489e-02,  8.7113e-02,\n",
       "                       -7.4404e-02, -2.6330e-02,  4.5242e-02,  2.6464e-02,  1.6341e-02,\n",
       "                       -5.6333e-02,  1.2461e-02,  1.3445e-02,  7.6695e-02, -2.1207e-02,\n",
       "                       -2.6927e-02, -8.4875e-02,  3.1415e-02,  6.7293e-02,  8.3754e-02,\n",
       "                        5.8478e-02, -1.6617e-02,  3.8618e-02, -7.2580e-02,  7.5697e-03,\n",
       "                        6.7990e-03, -2.9184e-02, -9.8921e-02, -1.1811e-02, -9.4913e-02,\n",
       "                       -7.4985e-02, -4.5612e-02,  8.5575e-02, -1.9439e-02,  3.9289e-02,\n",
       "                        3.9233e-02,  9.9319e-02,  5.0684e-03, -2.6759e-02,  8.7110e-02,\n",
       "                        7.1203e-02,  6.3406e-02, -1.3489e-02,  2.6404e-02, -7.9519e-02,\n",
       "                        1.1064e-02, -8.1368e-02,  8.6307e-02,  9.1425e-02, -7.1142e-02,\n",
       "                        4.8220e-02, -1.4438e-02, -1.2108e-02,  1.3381e-02,  8.4416e-02,\n",
       "                       -6.5263e-02,  2.3883e-02, -5.1343e-02,  8.7909e-02, -4.7940e-02],\n",
       "                      [ 2.7827e-02, -1.1469e-02, -9.7102e-02, -4.5945e-02,  3.7090e-03,\n",
       "                       -2.6186e-02,  3.3741e-02,  7.8327e-02, -6.2320e-02, -8.0161e-02,\n",
       "                       -9.6649e-02, -6.2130e-02,  4.0724e-02,  4.0273e-02,  6.3075e-02,\n",
       "                        4.9413e-02, -5.8846e-02, -3.5859e-02,  4.4722e-02,  9.7996e-02,\n",
       "                        8.4778e-02,  8.5285e-02,  3.7230e-02,  3.1763e-02, -3.3615e-02,\n",
       "                        7.5885e-02, -6.3433e-02, -8.3681e-02,  2.5550e-02, -2.1036e-02,\n",
       "                        4.4882e-02, -4.5506e-02, -8.3456e-03, -9.6378e-02,  2.4603e-02,\n",
       "                        7.6775e-02, -4.9380e-02, -8.2466e-02,  1.9352e-02, -7.2835e-02,\n",
       "                       -1.2716e-02, -9.7795e-02, -1.9127e-02,  4.4196e-02, -5.1582e-02,\n",
       "                       -8.4968e-02,  3.8181e-02,  2.0923e-02, -2.3358e-02,  5.1537e-03,\n",
       "                       -5.2837e-02,  7.6867e-02, -6.5125e-02,  3.9345e-02, -9.6399e-02,\n",
       "                       -5.9323e-02, -7.5874e-02, -7.2675e-02,  4.0534e-02, -7.1627e-02,\n",
       "                       -1.2192e-02,  3.2040e-02, -5.8279e-03,  3.5603e-03,  4.5029e-02,\n",
       "                        1.5228e-02, -6.3042e-02, -2.0135e-03, -3.5279e-02, -5.6562e-02,\n",
       "                        1.5017e-02,  1.3406e-02, -2.7314e-02, -2.8235e-02, -7.2622e-03,\n",
       "                        5.2096e-02,  1.4695e-02,  7.7038e-02,  9.7532e-02,  9.1463e-02,\n",
       "                       -6.7070e-02,  2.0021e-02,  8.0271e-02,  3.3620e-02,  6.2281e-02,\n",
       "                       -8.8614e-02, -8.3221e-02,  6.1925e-02, -8.5266e-02, -6.2464e-02,\n",
       "                       -1.0248e-02,  5.4973e-02,  6.6487e-02,  5.9272e-02, -7.2988e-02,\n",
       "                       -1.3908e-02, -4.5376e-02, -4.4076e-02, -6.6564e-02, -9.9448e-02],\n",
       "                      [-3.1262e-02, -6.6631e-02,  2.9524e-02, -6.1023e-02,  5.7160e-02,\n",
       "                       -9.4767e-02, -9.2958e-02, -3.3356e-02,  9.5141e-02,  2.6430e-02,\n",
       "                       -5.4213e-02,  7.7522e-02,  2.3278e-02, -3.2220e-02,  6.6378e-03,\n",
       "                       -1.0090e-03, -8.9399e-02, -5.3077e-02,  2.7130e-02,  1.7080e-02,\n",
       "                        3.9743e-02,  6.7350e-02, -4.7272e-02,  1.2871e-02, -2.8621e-02,\n",
       "                       -2.4401e-02, -9.5107e-05, -9.2366e-03,  9.0874e-02,  7.2212e-02,\n",
       "                       -9.4674e-02, -3.5570e-03, -3.4211e-02, -5.5884e-02,  9.5935e-02,\n",
       "                        4.5744e-02,  4.8629e-02,  5.7982e-02,  2.6445e-02, -5.9679e-02,\n",
       "                       -5.1274e-02, -3.1868e-02,  6.0861e-02, -3.1090e-02, -7.7177e-02,\n",
       "                       -2.3810e-02, -1.0758e-02, -3.0101e-03, -1.8018e-02, -6.5560e-03,\n",
       "                       -6.5183e-02,  3.9790e-02, -1.3455e-02,  7.3681e-02, -2.0760e-02,\n",
       "                        7.1405e-02,  8.0200e-02, -6.7373e-02, -8.5167e-02, -7.6572e-03,\n",
       "                       -8.7931e-02,  6.4871e-02,  3.4392e-02,  7.9725e-02, -5.5729e-02,\n",
       "                        1.6313e-02, -5.9628e-02,  4.9435e-02,  6.7778e-02,  6.9083e-02,\n",
       "                        6.2804e-02, -4.5711e-02, -2.7930e-02, -7.6043e-02,  8.8622e-02,\n",
       "                        8.7977e-03, -2.7620e-02, -1.4938e-02, -9.7226e-02, -9.9607e-02,\n",
       "                        4.9642e-02, -3.7584e-02, -6.8043e-02, -2.8916e-02, -9.8664e-02,\n",
       "                        9.8107e-02,  6.9992e-02,  9.4596e-02, -3.8248e-02,  6.5898e-02,\n",
       "                       -5.0680e-02,  5.5015e-02,  8.9211e-02,  5.0154e-02, -7.6337e-02,\n",
       "                        4.7984e-02,  9.9856e-02, -8.8466e-02, -2.7005e-02, -5.8521e-02],\n",
       "                      [ 3.7593e-02, -3.1089e-02,  2.5036e-02, -4.4240e-03,  5.9752e-02,\n",
       "                        4.1841e-02, -3.7123e-03, -1.2879e-02, -2.7479e-02,  3.4676e-02,\n",
       "                       -5.0929e-02, -1.8724e-02, -9.7202e-02, -8.3314e-02, -5.0216e-02,\n",
       "                        7.0868e-02, -5.9692e-02,  9.6693e-02, -8.2368e-02,  5.2901e-02,\n",
       "                        8.2619e-02, -3.3596e-02,  7.3814e-02,  6.5059e-02,  4.3535e-02,\n",
       "                       -5.5748e-02,  8.6255e-02,  4.1750e-02,  6.4224e-02, -9.0819e-02,\n",
       "                        2.3945e-02,  3.5285e-02, -2.4884e-02,  6.7267e-02,  8.6971e-02,\n",
       "                        3.5456e-02, -9.4676e-02,  1.8029e-02, -3.3303e-02,  2.7799e-03,\n",
       "                        3.3639e-02,  5.9836e-02, -4.7821e-02, -9.2199e-02, -4.7181e-02,\n",
       "                       -1.2798e-02,  7.9150e-02,  5.4727e-02, -7.4529e-03, -2.3881e-04,\n",
       "                       -4.1294e-02, -6.7017e-02, -2.3152e-03,  3.3279e-02,  2.0999e-02,\n",
       "                        4.0848e-02,  1.6144e-02,  6.9930e-02,  1.0486e-02,  9.9744e-02,\n",
       "                       -1.3204e-02, -4.3243e-02, -1.8375e-02,  4.8898e-02, -6.0826e-02,\n",
       "                        7.6468e-02, -4.4835e-02,  4.0011e-02, -4.6876e-02, -5.5612e-03,\n",
       "                       -8.2746e-02,  8.9566e-02, -8.2584e-02,  4.1025e-02, -8.7650e-02,\n",
       "                       -7.2063e-02, -3.6065e-02,  3.9355e-02, -3.2594e-02, -4.1054e-02,\n",
       "                       -8.3382e-02, -6.4334e-02, -7.6834e-02,  4.9103e-02, -2.1044e-02,\n",
       "                       -6.3009e-02,  4.0924e-02, -8.7054e-02,  9.2662e-02, -3.0519e-02,\n",
       "                        9.7471e-02, -9.0429e-02,  5.7905e-02, -5.1088e-03,  6.6026e-03,\n",
       "                        5.6491e-02, -4.6291e-02,  8.5962e-02, -1.2815e-02, -3.0915e-02],\n",
       "                      [-9.3582e-02,  1.7228e-02, -1.1633e-02,  6.3671e-02, -3.2830e-02,\n",
       "                       -5.8598e-02, -4.3250e-02, -1.1449e-02, -8.8387e-02, -4.7103e-02,\n",
       "                        7.5432e-02,  1.9466e-02, -6.5523e-02, -1.1648e-02,  5.5656e-02,\n",
       "                       -3.3535e-02,  7.2543e-02, -3.2294e-02, -1.5061e-02, -4.2211e-02,\n",
       "                       -1.1998e-02,  8.0857e-02, -7.3933e-02, -5.9826e-02, -1.5970e-02,\n",
       "                       -2.2018e-02,  6.6600e-02, -3.9302e-02,  7.7290e-02, -7.5449e-02,\n",
       "                        3.1214e-02, -4.1057e-02, -9.4033e-03,  1.5747e-02,  3.5555e-02,\n",
       "                        6.6079e-02,  1.7799e-02, -7.3818e-02,  5.8827e-02, -3.5294e-02,\n",
       "                       -5.4471e-02,  1.3014e-02,  8.3136e-02,  9.9490e-02, -7.7888e-02,\n",
       "                       -3.6760e-02,  6.2831e-02, -4.1676e-02,  9.1309e-02,  5.1643e-02,\n",
       "                        6.9433e-02,  6.3024e-02, -7.6546e-02, -1.0834e-02, -9.7825e-02,\n",
       "                        1.0553e-02, -4.8155e-02, -4.3341e-02, -8.6495e-02, -9.9697e-02,\n",
       "                       -5.4479e-02, -4.3627e-02,  9.2338e-02, -4.6409e-02,  6.7574e-02,\n",
       "                       -8.4370e-02, -9.0139e-02,  2.4736e-03, -3.9665e-02, -7.0764e-03,\n",
       "                       -3.7192e-02,  6.8221e-02, -1.9810e-02, -2.6637e-02, -9.5572e-02,\n",
       "                       -3.5461e-02,  3.7869e-02, -3.2200e-02, -1.3781e-02,  5.0253e-02,\n",
       "                        7.4216e-03, -6.3810e-02, -1.6652e-02,  5.8102e-02, -6.1930e-02,\n",
       "                       -4.8951e-02,  6.3206e-02,  7.7405e-02,  2.0546e-02, -5.8581e-02,\n",
       "                       -5.7572e-02, -3.1734e-02,  8.3900e-02, -5.3068e-02,  8.7080e-02,\n",
       "                       -1.9179e-02,  4.9676e-03,  9.1313e-02, -2.2561e-02,  2.4890e-02],\n",
       "                      [-9.6688e-02, -2.9981e-02,  5.1407e-03,  5.6160e-02,  9.6117e-03,\n",
       "                       -2.5627e-02, -4.7792e-02, -9.0432e-02, -6.7610e-02,  3.9604e-03,\n",
       "                       -3.0132e-02,  3.9348e-02, -7.9343e-02, -7.5823e-02, -1.1383e-02,\n",
       "                        1.5774e-02, -3.9616e-02,  1.2969e-02,  1.7376e-02,  4.0553e-02,\n",
       "                       -5.4318e-03,  9.8938e-02, -7.3064e-02,  6.3894e-02, -4.1975e-02,\n",
       "                        9.4080e-02, -3.4331e-02,  1.2772e-02, -1.4732e-02, -6.8617e-02,\n",
       "                        7.3802e-02, -3.5796e-02,  7.7235e-03,  2.2911e-02,  7.4367e-02,\n",
       "                        3.2385e-02, -6.1735e-02, -1.9411e-02,  8.3894e-02,  4.9785e-02,\n",
       "                        3.4444e-02,  3.0888e-02, -9.5824e-02, -5.7070e-03,  1.5657e-03,\n",
       "                        9.9298e-02, -8.5389e-02, -5.2430e-02,  9.7990e-02,  9.5673e-02,\n",
       "                       -1.4951e-02, -2.6868e-04,  4.9158e-02,  9.7411e-02,  9.9308e-02,\n",
       "                       -7.0282e-02,  3.1580e-02, -8.7752e-02, -3.7506e-02,  6.6077e-02,\n",
       "                       -6.5963e-02, -8.2309e-02,  3.2092e-02, -6.9650e-02,  4.5463e-02,\n",
       "                        9.1953e-02,  4.5219e-02, -7.0945e-02, -2.2132e-02,  5.8128e-02,\n",
       "                        9.1723e-02, -9.6537e-03,  1.6802e-02, -4.8279e-02, -3.0549e-02,\n",
       "                        3.0292e-02, -5.5015e-02, -3.2044e-02, -7.5170e-02, -4.7071e-03,\n",
       "                        8.0306e-02,  4.5042e-02, -7.7147e-02, -5.0411e-04,  1.9141e-02,\n",
       "                       -6.9223e-02, -7.0964e-02, -4.1757e-02,  7.2602e-02,  6.6683e-02,\n",
       "                       -1.6199e-03, -9.0731e-02, -8.4823e-02,  8.7276e-02,  4.1309e-02,\n",
       "                        4.4045e-02, -5.3301e-02, -7.4710e-03, -5.4882e-02, -6.4691e-02],\n",
       "                      [-9.0806e-02, -4.2254e-02,  2.6332e-03, -1.9242e-02, -5.7614e-02,\n",
       "                       -2.6726e-02, -9.7431e-02,  5.5080e-02, -4.5619e-02, -6.2399e-02,\n",
       "                       -2.1042e-02,  4.2885e-02,  3.1430e-02,  1.1054e-02,  6.2751e-02,\n",
       "                        7.0543e-02, -8.6463e-03,  5.6838e-02,  9.6467e-02, -2.3790e-02,\n",
       "                        1.4696e-02,  1.7046e-03,  6.0199e-02,  1.6078e-02, -7.2888e-02,\n",
       "                        9.2494e-02,  7.4091e-02, -4.3504e-02,  9.7285e-02, -7.5916e-02,\n",
       "                        4.5151e-02, -2.4244e-02,  7.6203e-02,  8.9228e-02,  5.1742e-02,\n",
       "                        9.4354e-02, -7.3001e-02,  9.5834e-02,  4.3686e-02, -4.0123e-02,\n",
       "                       -6.3766e-02, -4.3652e-02,  2.3386e-02, -5.1906e-02,  8.4648e-02,\n",
       "                        6.8081e-02, -8.9303e-02, -5.7047e-02, -3.4539e-02, -9.2489e-02,\n",
       "                        5.1871e-03, -1.9002e-03, -7.6727e-02,  8.5329e-02,  5.4396e-02,\n",
       "                       -6.1735e-02,  5.5555e-02, -3.8917e-03, -5.0648e-02,  7.7824e-02,\n",
       "                       -7.8288e-02,  5.9262e-02, -2.9057e-02, -1.7409e-02, -2.3704e-02,\n",
       "                       -9.1592e-02,  8.3031e-02,  3.4634e-02, -7.2933e-02,  4.8683e-02,\n",
       "                        2.2976e-02,  5.9563e-02,  6.2457e-02,  9.6588e-02, -6.3084e-02,\n",
       "                        6.6453e-02, -8.4374e-02,  6.5838e-03, -8.9410e-02, -6.8432e-03,\n",
       "                        1.5982e-03,  4.1390e-02,  2.0636e-02, -3.8100e-02,  4.9125e-02,\n",
       "                        8.4511e-02, -3.2430e-02, -2.2517e-03, -8.1667e-02, -3.9426e-02,\n",
       "                        3.2008e-02, -6.0298e-02, -4.5742e-03,  6.3969e-02, -9.6848e-02,\n",
       "                       -1.2591e-02,  2.9569e-02,  7.0861e-02, -1.9956e-03, -1.0980e-02],\n",
       "                      [-9.4103e-02, -3.5877e-02,  4.6626e-02, -8.0206e-02,  8.6257e-02,\n",
       "                       -3.6922e-02, -8.6712e-02, -1.2848e-02,  4.5402e-02, -7.1383e-02,\n",
       "                        8.0495e-02, -6.9596e-03,  9.7850e-02, -3.9891e-02, -5.2837e-02,\n",
       "                        7.1624e-03,  1.8160e-02,  8.0040e-03, -6.1718e-02, -7.0888e-02,\n",
       "                       -9.9979e-03, -8.2293e-02, -3.7021e-03,  2.5398e-02,  3.2238e-02,\n",
       "                       -7.2920e-02, -5.4611e-02,  7.8534e-02, -7.8137e-02,  9.1311e-03,\n",
       "                        5.5462e-02,  2.6647e-02, -6.7877e-02, -7.2888e-02,  5.2312e-03,\n",
       "                       -6.9704e-02,  6.1361e-03,  4.9413e-02, -2.0117e-02, -2.3962e-02,\n",
       "                       -4.6552e-02, -2.5030e-02,  6.2391e-02, -9.7488e-02, -4.9702e-02,\n",
       "                        1.4607e-02, -9.1653e-02, -1.8422e-02, -8.5919e-02,  2.1384e-02,\n",
       "                       -1.2945e-03, -1.3531e-02,  1.6738e-02, -8.0020e-02, -2.8144e-02,\n",
       "                       -7.5980e-02,  7.8555e-02, -3.1243e-02,  5.7787e-02,  1.6620e-02,\n",
       "                       -2.7134e-02, -4.1060e-02, -2.4212e-02, -9.6689e-02, -9.3730e-02,\n",
       "                       -1.6249e-02, -6.4755e-02,  3.7203e-02, -2.1032e-03,  5.8220e-02,\n",
       "                       -9.5702e-03,  7.7521e-02,  5.1173e-04,  8.1313e-02,  9.4036e-02,\n",
       "                        7.6560e-02, -6.0602e-02, -9.4725e-02,  7.4830e-02,  3.3819e-02,\n",
       "                        4.1148e-02, -3.4041e-02, -2.1886e-02,  9.0899e-02, -2.6571e-02,\n",
       "                       -5.7989e-02,  5.1823e-02,  6.5062e-02,  5.8190e-02,  3.5404e-02,\n",
       "                       -5.6346e-02, -4.6502e-02, -9.3984e-03,  6.0086e-02, -4.3050e-02,\n",
       "                       -8.3520e-02, -4.4842e-02, -7.9770e-02,  8.3293e-02, -3.2302e-02]])),\n",
       "             ('linear_relu_stack.4.bias',\n",
       "              tensor([-0.0502,  0.0065,  0.0772,  0.0176,  0.0603, -0.0319,  0.0347,  0.0165,\n",
       "                      -0.0455, -0.0817]))])"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 81
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练\n",
    "\n",
    "pytorch的训练需要自行实现，包括\n",
    "1. 定义损失函数\n",
    "2. 定义优化器\n",
    "3. 定义训练步\n",
    "4. 训练"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.734023Z",
     "start_time": "2025-01-19T12:12:32.730429Z"
    }
   },
   "source": [
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()  #内部先做softmax，然后计算交叉熵\n",
    "# 2. 定义优化器 采用SGD   优化器用来更新模型参数，使得损失函数最小 \n",
    "# Optimizers specified in the torch.optim package,随机梯度下降。 动量（momentum），用于加速梯度下降过程。\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)"
   ],
   "outputs": [],
   "execution_count": 82
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.739036Z",
     "start_time": "2025-01-19T12:12:32.735022Z"
    }
   },
   "cell_type": "code",
   "source": "10000 / 32",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "312.5"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 83
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.744340Z",
     "start_time": "2025-01-19T12:12:32.740037Z"
    }
   },
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# 评估函数\n",
    "@torch.no_grad()  # 装饰器，禁止反向传播，节省内存\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []  # 记录损失\n",
    "    pred_list = []  # 记录预测\n",
    "    label_list = []  # 记录标签\n",
    "    for datas, labels in dataloader:  #10000/32=312\n",
    "        datas = datas.to(device)  # 转到GPU\n",
    "        labels = labels.to(device)  # 转到GPU\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)  # 验证集损失,loss尺寸是一个数值\n",
    "        loss_list.append(loss.item())  # 记录损失,item是把tensor转换为数值   如果张量是一个标量，(即只有一个元素)，item()会返回该元素的python数值。\n",
    "\n",
    "        preds = logits.argmax(axis=-1)  # 验证集预测,argmax返回最大值索引\n",
    "        # print(preds)\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())  #将PyTorch张量转换为NumPy数组。只有当张量在CPU上时，这个转换才是合法的\n",
    "        # print(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "\n",
    "    acc = accuracy_score(label_list, pred_list)  # 计算准确率\n",
    "    return np.mean(loss_list), acc\n"
   ],
   "outputs": [],
   "execution_count": 84
  },
  {
   "cell_type": "code",
   "source": "1875 * 20",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:12:32.749168Z",
     "start_time": "2025-01-19T12:12:32.745339Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37500"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 85
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:17:03.653358Z",
     "start_time": "2025-01-19T12:12:43.475224Z"
    }
   },
   "source": [
    "# 训练    eval_step=500 每500步评估一次\n",
    "def training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=500):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "\n",
    "    global_step = 0\n",
    "    model.train()  #把模型切换为训练模式\n",
    "    #tqdm是一个进度条库\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:  # 进度条 1875*20,60000/32=1875\n",
    "        for epoch_id in range(epoch):  # 训练epoch次  把数据集重复训练epoch次\n",
    "            # training\n",
    "            for datas, labels in train_loader:  #执行次数是60000/32=1875  梯度更新了1875次\n",
    "                datas = datas.to(device)  #datas尺寸是[batch_size,1,28,28]\n",
    "                labels = labels.to(device)  #labels尺寸是[batch_size]\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传，loss.backward()会计算梯度，loss对模型参数求导\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等,优化器的学习率会随着训练的进行而减小，更新w,b\n",
    "                optimizer.step()  #梯度是计算并存储在模型参数的 .grad 属性中，优化器使用这些存储的梯度来更新模型参数\n",
    "\n",
    "                preds = logits.argmax(axis=-1)  # 训练集预测\n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())  # 计算准确率，numpy可以\n",
    "                loss = loss.cpu().item()  # 损失转到CPU，item()取值,一个数值\n",
    "                # record\n",
    "\n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })  # 记录训练集信息，每一步的损失，准确率，步数\n",
    "\n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()  # 进入评估模式\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()  # 进入训练模式\n",
    "\n",
    "                # udate step\n",
    "                global_step += 1  # 全局步数加1\n",
    "                pbar.update(1)  # 更新进度条\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})  # 设置进度条显示信息\n",
    "\n",
    "    return record_dict\n",
    "\n",
    "\n",
    "epoch = 20  #改为40\n",
    "model = model.to(device)\n",
    "record = training(model, train_loader, val_loader, epoch, loss_fct, optimizer, eval_step=1000)"
   ],
   "outputs": [
    {
     "data": {
      "text/plain": [
       "  0%|          | 0/37500 [00:00<?, ?it/s]"
      ],
      "application/vnd.jupyter.widget-view+json": {
       "version_major": 2,
       "version_minor": 0,
       "model_id": "e6680298e8814d2ea4bb583fb8195fb8"
      }
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 86
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"train\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:17:39.795946Z",
     "start_time": "2025-01-19T12:17:39.791484Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.3342799246311188, 'acc': 0.84375, 'step': 37495},\n",
       " {'loss': 0.21993856132030487, 'acc': 0.90625, 'step': 37496},\n",
       " {'loss': 0.28218787908554077, 'acc': 0.84375, 'step': 37497},\n",
       " {'loss': 0.36852720379829407, 'acc': 0.875, 'step': 37498},\n",
       " {'loss': 0.2562214732170105, 'acc': 0.90625, 'step': 37499}]"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 87
  },
  {
   "cell_type": "code",
   "source": [
    "record[\"val\"][-5:]"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-01-19T12:27:10.964478Z",
     "start_time": "2025-01-19T12:27:10.960214Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.3622515476145112, 'acc': 0.8681, 'step': 33000},\n",
       " {'loss': 0.3590737660638631, 'acc': 0.8692, 'step': 34000},\n",
       " {'loss': 0.3524532402261568, 'acc': 0.8736, 'step': 35000},\n",
       " {'loss': 0.36133780673193855, 'acc': 0.8676, 'step': 36000},\n",
       " {'loss': 0.34186031133793415, 'acc': 0.8769, 'step': 37000}]"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 91
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:27:13.195126Z",
     "start_time": "2025-01-19T12:27:13.022759Z"
    }
   },
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=1000):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "    last_step = train_df.index[-1]  # 最后一步的步数\n",
    "    # print(train_df.columns)\n",
    "    print(train_df['acc'])\n",
    "    print(val_df['acc'])\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)  # 画几张图,分别是损失和准确率\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):\n",
    "        # print(train_df[item].values)\n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()  # 显示网格\n",
    "        axs[idx].legend()  # 显示图例\n",
    "        axs[idx].set_xticks(range(0, train_df.index[-1], 5000))  # 设置x轴刻度\n",
    "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x / 1000)}k\", range(0, last_step, 5000)))  # 设置x轴标签\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "plot_learning_curves(record)  #横坐标是 steps"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "step\n",
      "0        0.09375\n",
      "1000     0.56250\n",
      "2000     0.84375\n",
      "3000     0.84375\n",
      "4000     0.68750\n",
      "5000     0.90625\n",
      "6000     0.93750\n",
      "7000     0.96875\n",
      "8000     0.87500\n",
      "9000     0.84375\n",
      "10000    0.84375\n",
      "11000    0.84375\n",
      "12000    0.78125\n",
      "13000    0.78125\n",
      "14000    0.87500\n",
      "15000    0.84375\n",
      "16000    0.87500\n",
      "17000    0.90625\n",
      "18000    0.87500\n",
      "19000    0.87500\n",
      "20000    0.93750\n",
      "21000    0.78125\n",
      "22000    0.96875\n",
      "23000    0.90625\n",
      "24000    0.96875\n",
      "25000    0.84375\n",
      "26000    0.84375\n",
      "27000    0.87500\n",
      "28000    0.93750\n",
      "29000    0.87500\n",
      "30000    0.87500\n",
      "31000    0.96875\n",
      "32000    0.78125\n",
      "33000    0.96875\n",
      "34000    0.96875\n",
      "35000    0.71875\n",
      "36000    0.81250\n",
      "37000    0.87500\n",
      "Name: acc, dtype: float64\n",
      "step\n",
      "0        0.0985\n",
      "1000     0.6663\n",
      "2000     0.7658\n",
      "3000     0.7944\n",
      "4000     0.8067\n",
      "5000     0.8166\n",
      "6000     0.8194\n",
      "7000     0.8254\n",
      "8000     0.8272\n",
      "9000     0.8327\n",
      "10000    0.8390\n",
      "11000    0.8390\n",
      "12000    0.8388\n",
      "13000    0.8435\n",
      "14000    0.8450\n",
      "15000    0.8550\n",
      "16000    0.8521\n",
      "17000    0.8541\n",
      "18000    0.8541\n",
      "19000    0.8554\n",
      "20000    0.8617\n",
      "21000    0.8584\n",
      "22000    0.8627\n",
      "23000    0.8620\n",
      "24000    0.8661\n",
      "25000    0.8656\n",
      "26000    0.8669\n",
      "27000    0.8695\n",
      "28000    0.8630\n",
      "29000    0.8639\n",
      "30000    0.8708\n",
      "31000    0.8702\n",
      "32000    0.8704\n",
      "33000    0.8681\n",
      "34000    0.8692\n",
      "35000    0.8736\n",
      "36000    0.8676\n",
      "37000    0.8769\n",
      "Name: acc, dtype: float64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ],
      "image/png": "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T2HChAlITExEXl4ebrnlFtTWtp379tVXX2Hu3LlISEhAeno6zj77bFRWaiFFss4//OEPaqioxWLBwIED8cgjjyCcoKNDCOkQiUbefKQKl00boOKSe3tSocRMr9pbri4P6dP9IAJCOsJh1UrXHGYKHUJ6BFs98Gi/0Lz2L48CsV0fPLv88stx++234/PPP8dZZ52lrquoqMCSJUuwePFiJUIWLVqkxIQIi1deeQXnn38+du/erUSGrxiNRvz5z3/GkCFDcODAASV07r77bjz77LPq9k2bNql1iMj605/+BLPZjM8++wzNzc3q9nvvvRd///vf8cc//hGnnHIKioqKsGvXLoQTFDqEkA75yVkjMGFAGhaO03pKejtSvqYLne5GSxPSGU6bLnTYo0UI0RDH5JxzzsF//vMft9B58803kZmZiTPOOEMJk0mTJrnv//DDD+Odd97B+++/j9tuu83n17vjjjvahBj89re/xU033eQWOuLWTJ8+3X1ZGDNmDKqrq1FTU6PEz1//+ldce+216rZhw4YpwRNOUOgQQjrtJ7lgUoiOgIUweS0YQQSEtMFVuoYYOoeE9AjyuybOSqhe20uuvvpq3HjjjUpciGvz73//G9/97neVyBFH54EHHsBHH32k3BO73Y6GhgYUFBT4taxPP/0Ujz32mHJhRLzI8zU2NqK+vl6VqomjIy6TJ3bu3Immpia3IAtXKHQIIcSFlK7pBDJampD2rMs4F/88koNxfWaGeimERAcy7dqL8rFQI6VoTqdTiRnpwVm1apUqDRN+9rOfYdmyZXjiiSdUX0x8fDwuu+wyWK1Wn18nPz8f5513Hm6++WZVCpeRkYEvv/wSP/zhD9XzidCR5++Izm4LJxhGQAghLob0SUS/1DgkW8wYnpUU6uWQXsy+mJF4x3EqatLGhHophJAwIi4uDpdccolycv773/9i1KhRmDp1qjsY4LrrrsPFF1+sQgRycnKUYPGH9evXqzCBJ598EieffDJGjhyJo0fbOl4TJ07E8uXLPT5+xIgRSux0dHu4QEeHEEJapaF98JNTYG12INHCP48kePxwziBk1B7C+RNzQ70UQkiYIeVr4rZs374d3/ve99qIi7ffflu5PhKg85vf/OaEhDZvGT58OGw2G/7yl7+o5xMR9fzzz7e5j4QNiKCSkALp3YmNjVXCRpLXJMDgF7/4hQovkOvnzJmDsrIytWZxhcIFOjqEENKKPkkW5KZGhiVPIhcpjRyV5sQgpvsRQtpx5plnqlIySVO76qqr2sRBS2DB7NmzlThZuHCh2+3xlUmTJqnn+/3vf4/x48crB0n6dVojLs/SpUuxefNmzJgxA7NmzVLBB5K+JojQ+ulPf4r77rtPhRRcccUVKC0tRTjBQ5aEEEIIIYSECRI80L6MTE9Gk3jn1tx6661tLvtSynbnnXeqrTXf//7321w+/fTTldujIw6SBBfo6/zVr36ltnCFjg4hhBBCCCGk10GhQwghhBBCSC9CStGSkpI8buPGjUO0wNI1QgghhBBCehEXXHABZs70HF8fExODaIFChxBCCCGEkF5EcnKy2qIdlq79//buBcjG+o/j+FdYSy4bi2VzzSa3NEizTPhnY1G5NJI0LokhRMqIyrViGCKZTBnU5LKRy9R0IdalXJpFVLLF0FKujcu6LHt5/vP9zZwzezkndtc553me837NnPScfQ6f8ztnn+/5Pb/f+T0AAABwHb3wJsL79aOjAwAAANfwTM26efNmqKOgGK5du1bsqXZMXQMAAIBrlCxZUipWrGguYBkZGWm+gK8X2LQrXbJZO2UZGRlmyWY7ywlCVh3J0U6OXpMnKirKvJ5FRUcHAAAArlKtWjX5448/pEyZMnL+/HmxM/1gf/36dSlbtqytO2TBzqqdnJiYmGL9HUXq6CxcuFBmz54tp0+fNldWXbBggbliqj+rV682V0/VixjFxcWZq7B27dq1OLkBAAAAn/RDeHp6urRp00bsLjMzU7Zv3y7t2rWz/YpomUHKqn93cUZyitzRSUpKkrFjx8qiRYvMsnXz5s2Tzp07S2pqquk957dz507p27evzJgxQ5544glZsWKF9OjRQ/bt2ydNmzYt9hMAAAAAfNEPy3bvPGjGrKwsM82OrHdWoSfXzZ07V4YMGSKDBg2Sxo0bmw5PuXLlZMmSJT73nz9/viQmJsq4ceOkUaNGMn36dGnRooV88MEHdyI/AAAAABRvREe/fLR3716ZMGGC9z79IlJCQoLs2rXL52P0fh0Byk1HgNavX+/337lx44a5eVy+fNk7XKa3wvI8piiPDTayBo6T8pI1MJyU1S55ndJWAAAUq6OjX+bKzs6W6tWr57lftw8fPuzzMfo9Hl/76/3+6DS3qVOnFrh/48aNZvSoqDZt2iROQdbAcVJesgaGk7KGOq9neU8AAJzGlquu6YhR7lGgS5cuSe3atSU+Pr5IV3nVM5LJycnyv//9z/bzCckaOE7KS9bAcFJWu+TVL/MqLryXl6c9PDMOivLaaidSH++U96JT8pI1cJyUl6yBYZesnmPvrWpToTo60dHR5ktIZ86cyXO/bvtb/k3vL8z+SpcC1Fv+J1OvXr3CxAUA3MEOT6VKlUIdwzY8HcBatWqFOgoAhK30W9SmQnV0IiIipGXLlrJ582azcprnwkG6PXLkSJ+P0VEY/fmYMWPyTMPQ+29XzZo15cSJE2Y0pyhrdmtHSYuR/h16ASk7I2vgOCkvWQPDSVntklfPlmkh0eMwwrMuOS0vWQPHSXnJGhh2yXq7tanQU9d0StmAAQOkVatW5to5urz01atXzSpsqn///hIbG2u+Z6NGjx4t7du3lzlz5ki3bt1k1apVkpKSIh999NFt/5u64MG9994rxaUviN3fQB5kDRwn5SVrYDgpqx3yMpJTUDjWJaflJWvgOCkvWd2b9XZqU6E7On369JFz587JpEmTzIICDz30kHz77bfeBQfS0tJMAfDQCzXptXPefPNNmThxorlgqK64xjV0AAAAANhqMQKdpuZvqtrWrVsL3Ne7d29zAwAAAABbXjDUiXRhg8mTJ+dZ4MCuyBo4TspL1sBwUlYn5oV7X1sn5SVr4DgpL1kDw0lZVQmLNUMBAAAAuExYjOgAAAAACC90dAAAAAC4Dh0dAAAAAK4TVh0dvaibLm3tBE7Kmt/x48dN/p9//lnszklZPasaat6LFy+K3ZE1MJyUFe463jslpxuO907K6rTjklOyOiWn3fO6rqOzcOFCqVu3rkRGRsojjzwiP/30k9jRlClTzBsi9+2BBx4QO9i+fbs8+eST5mqzvgqbrl+h11GqUaOGlC1bVhISEuTPP/+0ZdaBAwcWaOfExMSQZNWL6D788MPmSurVqlWTHj16SGpqap59MjIyZMSIEVKlShUpX768PP3003LmzBlbZu3QoUOBth02bJiEwocffigPPvig9wJm8fHx8s0339iuXW8nq53aFeFVm+xclxS1KTCoTYHhpLrk5trkqo5OUlKSjB071ix7t2/fPmnevLl07txZzp49K3bUpEkTOXXqlPf2ww8/iB1cvXrVtJ0WZl9mzZol77//vixatEj27Nkjd999t2ln/aW1W1alxSN3O69cuVJCYdu2beagtnv3btm0aZNkZmZKp06dzHPweOWVV+TLL7+U1atXm/3/+ecf6dWrly2zqiFDhuRpW31vhIJeoX7mzJmyd+9eSUlJkccee0y6d+8uv/32m63a9Xay2qldEX61ya51SVGbAoPaFBhOqkuurk2Wi7Ru3doaMWKEdzs7O9uqWbOmNWPGDLOtT3fdunXen0+aNMmKiYmxDhw4EPSskydPtpo3b+7353bJmj9HTk6OyTF79mzvfRcvXrTKlCljrVy50mwfO3bMPG7//v1mOysryxo0aJDVsGFD66+//gpaVjVgwACre/fufh8Tqqzq7Nmz5t/etm2btx1Lly5trV692rvP77//bvbZtWuX2U5OTjbbFy5cMNtXr161EhMTrTZt2njvC0ZW1b59e2v06NF+HxOqrB733HOPtXjxYlu3a/6sTmhXuLc2OaUu+cpCbbpzqE2B46S65Jba5JoRnZs3b5peqA5Ve9x1111me9euXXn21ePOqFGj5NNPP5UdO3aYobpQ0CF1HdauX7++9OvXT9LS0grsY5esHseOHZPTp0/naedKlSqZqRj521nduHFDevfubeYZa/7atWuHZN6oDnE3bNhQhg8fLv/++6/P/YKd9dKlS+bPypUrmz/1/atnp3K3rU4b0Ry+2lbnwT7++OOSk5NjzmxFRUUFLavH8uXLJTo6Wpo2bSoTJkyQa9eu+Xx8MLNmZ2fLqlWrzBk+HXq3c7vmz2rndkV41CYn1iVFbbpzqE3hXZfcVptKiUucP3/evDDVq1fPc79uHz582LudlZUlzz//vOzfv98MycfGxoYgrZiD77Jly8wBTof/pk6dKo8++qj8+uuvZu6pnbLmpoVE+Wpnz888rly5It26dTMH6eTkZFN0gk2nBuhQcL169eTo0aMyceJE6dKlizmQlCxZMmRZ9Zd/zJgx0rZtW3PAUNp+ERERBQ4IvtpWt/v06SNxcXGyYsUK87hgZlXPPfec1KlTx3woOnjwoIwfP97MlV67dm1Isv7yyy/mgKzTVHS+87p166Rx48bmw4Hd2tVfVju2K8KnNjm1Lilq051BbQrfuuTW2uSajs7t0jmRZcqUMfM7tVcaKnpA89CzYVpg9A30+eefy+DBg22Vtaj69u1r5nxu2bLFfDE0FJ599lnv/zdr1sy09X333WfOpHXs2DFkWXWOsX54KOr8dz1T0rp1azP3P3dRDGbWoUOH5mlb/QKwtqkWbW3jYGfVD2daPPQM35o1a2TAgAFm3nNhhDqrFhS7tSuCww7H+3CoS4ra5B+1KXzrkltrk2umrukBVxs0/4oVuh0TE5PnBfj777/lu+++EzvRXv39998vR44csXVWT1veqp1V165dTa/f1zBsqOh0DH2v5G7nYGcdOXKkfPXVV+bsnBYwD20/neaSf2lGX22rZ/h0VZ9Dhw6FJKsv+qFI5W/bYGXVs0YNGjSQli1bmpV59IvA8+fPt2W7+stqx3ZF+NYmp9QlRW0qPmpTeNclt9Ym13R09MXRF2bz5s15hjV1O/f8wqeeesoMpb344otm/qFd6PC09oq1h2znrDrMrr+Eudv58uXLZoWb3O2sdM6xruChz6OwZzAC5eTJk2YedO52DlZWndeuB2cdCtazc9qWuen7t3Tp0nnaVoeFdY58/rbVrHqmRc+mBOJgcqusvniu95C/bQOd1R/9/dfpHnZq11tldUK7Inxqk1PqkqI2FR21KXjHUCfVJdfUJstFVq1aZVZYWbZsmXXo0CFr6NChVlRUlHX69OkCK5/oSheRkZF5VrwIpldffdXaunWrWVnlxx9/tBISEqzo6Gizgkios6anp5uVXvSmOebOnWv+37PSy8yZM027btiwwTp48KBZOaZevXrW9evXfa4W895771nly5e3duzYEdSs+rPXXnvNrGCimb7//nurRYsWVlxcnJWRkRH0rMOHD7cqVapkXvdTp055b9euXfPuM2zYMKt27drWli1brJSUFCs+Pt7c/K1qMmbMGKt69epmtZZgZj1y5Ig1bdo0k1HbUN8L9evXt9q1axf0rOr11183q+5oFn1P6naJEiWsjRs32qpdb5XVbu2K8KpNdq5LitpEbXJSbXJSXXJzbXJVR0ctWLDAvHEiIiLMkp67d+/2u8RjUlKSOVB/8cUXQc/Zp08fq0aNGiZnbGys2dY3kh2yet6s+W+6HKZnGc+33nrLvIG1eHfs2NFKTU31Pj7/AVrNmTPHqlChgimewcqqB75OnTpZVatWNcs41qlTxxoyZIj3w0Wws/rKqbelS5d699GC/NJLL5klHcuVK2f17NnTHMTzP9/cSzWOGjXKvJdyvwaBzpqWlmYOcJUrVzbvgQYNGljjxo2zLl26FPSs6oUXXjCvr/4+6eut70lPMbFTu94qq93aFeFVm+xclxS1idrkpNrkpLrk5tpUQv8T6lElAAAAALiTXPMdHQAAAADwoKMDAAAAwHXo6AAAAABwHTo6AAAAAFyHjg4AAAAA16GjAwAAAMB16OgAAAAAcB06OgAAAABch44OAAAAANehowPcIQMHDpQePXqEOgYAAAZ1CeGOjg4AAAAA16GjAxTSmjVrpFmzZlK2bFmpUqWKJCQkyLhx4+STTz6RDRs2SIkSJcxt69atZv8TJ07IM888I1FRUVK5cmXp3r27HD9+vMAZt6lTp0rVqlWlYsWKMmzYMLl582YInyUAwCmoS4BvpfzcD8CHU6dOSd++fWXWrFnSs2dPSU9Plx07dkj//v0lLS1NLl++LEuXLjX7avHIzMyUzp07S3x8vNmvVKlS8vbbb0tiYqIcPHhQIiIizL6bN2+WyMhIU4S02AwaNMgUq3feeSfEzxgAYGfUJcA/OjpAIQtKVlaW9OrVS+rUqWPu07NoSs+k3bhxQ2JiYrz7f/bZZ5KTkyOLFy82Z9OUFhw9i6bFo1OnTuY+LSxLliyRcuXKSZMmTWTatGnmbNz06dPlrrsYeAUA+EZdAvzjnQoUQvPmzaVjx46miPTu3Vs+/vhjuXDhgt/9Dxw4IEeOHJEKFSpI+fLlzU3PqGVkZMjRo0fz/L1aTDz0TNuVK1fM9AIAAPyhLgH+MaIDFELJkiVl06ZNsnPnTtm4caMsWLBA3njjDdmzZ4/P/bUotGzZUpYvX17gZzrvGQCA4qAuAf7R0QEKSYf627Zta26TJk0yUwXWrVtnhvmzs7Pz7NuiRQtJSkqSatWqmS9z/tcZtuvXr5tpBmr37t3mLFutWrUC/nwAAM5GXQJ8Y+oaUAh6huzdd9+VlJQU8yXPtWvXyrlz56RRo0ZSt25d80XO1NRUOX/+vPnCZ79+/SQ6OtqsaKNf+jx27JiZA/3yyy/LyZMnvX+vrmQzePBgOXTokHz99dcyefJkGTlyJPOgAQD/iboE+MeIDlAIevZr+/btMm/ePLOSjZ41mzNnjnTp0kVatWplioX+qVMDkpOTpUOHDmb/8ePHmy+K6mo4sbGxZj517jNpuh0XFyft2rUzXxzVFXSmTJkS0ucKALA/6hLgXwnLsqz/+DmAANPrFVy8eFHWr18f6igAAFCX4BqMPwIAAABwHTo6AAAAAFyHqWsAAAAAXIcRHQAAAACuQ0cHAAAAgOvQ0QEAAADgOnR0AAAAALgOHR0AAAAArkNHBwAAAIDr0NEBAAAA4Dp0dAAAAACI2/wfEb8Rv72vPuMAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 92
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-01-19T12:17:49.733054Z",
     "start_time": "2025-01-19T12:17:48.384513Z"
    }
   },
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "model.eval()  # 进入评估模式\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ],
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.3434\n",
      "accuracy: 0.8754\n"
     ]
    }
   ],
   "execution_count": 90
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
